boost-容器
Posted 一点一滴成长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost-容器相关的知识,希望对你有一定的参考价值。
1、array
array相当于是一个增加了STL容器接口的数组,但它不像vector等容器一样可以动态增长,如果需要动态变动array的容量可以使用boost::scoped_array。array适用与对运行速度要求很高的场合。C++11中已支持array。
eg:
#include <algorithm> using std::sort; #include "boost/array.hpp" #include "boost/typeof/typeof.hpp" using namespace boost; ....... array<int, 5> ary; array<int, 5> ary2 = { 1, 2, 3, 4, 5 };//可以使用{}初始化array ary = ary2;//赋值 swap(ary, ary2)//互换 ary.assign(0);//所有元素赋值为0 ary[0] = 1;//头元素 ary.back() = 10;//尾元素 ary.at(5);//使用at访问元素 int*p = ary.c_array();//获得原始数组指针 int s = ary.size();//获得数组中元素个数 sort(ary.begin(), ary.end());//使用STL排序函数对其排序 for (BOOST_AUTO(pos, ary.begin()); pos != ary.end(); ++pos)//遍历数组,使用BOOST_AUTO需要包含"boost/typeof/typeof.hpp"头文件 { int iNum; iNum = *pos; }
2、unordered_map、unordered_set
unordered_map和unordered_set都是散列容器(hash container),他们的查询和修改性能都优于map和set,不同的是unordered中的元素是乱序的,map是顺序的,且对于自定义类型的key,map需要定义operator<,unordered需要定义operator==。
C++11中已支持unordered_map和unordered_set,且其用法与map, set相同。
3、bimap
map是单向的(key—>value)关联容器,bimap则可以提供双向映射。bimap有两个视图,左视图和右视图,分别用成员变量left和right访问,相当于两个不同方向的map,其用法与map基本一致。
由于是双向映射,所以不仅bimap元素的key不能相同,value也不能相同。
#include "boost\bimap.hpp" using namespace boost; bimap<int, std::string> bmCity; typedef bimap<int, std::string>::value_type bimap_value;//map元素类型为pair(使用make_pair()来生成),bimap元素类型为value_type bmCity.insert(bimap_value(10, "北京")); bmCity.insert(bimap_value(20, "上海")); bmCity.insert(bimap_value(30, "广州")); bmCity.insert(bimap_value(40, "北京")); //正常作为map使用 bimap<int, std::string>::left_map::const_iterator iter, iter_end; iter = bmCity.left.begin(); iter_end = bmCity.left.end(); for (; iter != iter_end; iter++) { cout << iter->first << "-->" << iter->second << endl; } iter = bmCity.left.find(20);//通过key索引value if(iter != iter_end) cout << iter->second << endl; cout << "================" << endl; //将value作为key,key为value bimap<int, std::string>::right_map::const_iterator iter_right, iter_end_right; iter_right = bmCity.right.begin(); iter_end_right = bmCity.right.end(); for (; iter_right != iter_end_right; iter_right++) { cout << iter_right->first << "-->" << iter_right->second << endl; } iter_right = bmCity.right.find("上海");//通过value索引key if (iter_right != iter_end_right) cout << iter_right->second << endl;
4、circular_buffer
circular_buffer实现了一个循环容器,故其大小是固定的,当达到末尾时自动循环使用容器的另一端空间。circular_buffer支持标准的容器操作,其类似双端队列deque和栈stack的混合体,既支持deque的push_back()、push_front()、insert()来增加元素等,也支持stack的pop_back()、pop_front()来弹出元素。
circular_buffer的几个特殊的函数:full()判断容器是否已满。linearize()可以把缓冲区线性化一个连续的普通数组,is_linearize()用来检测是否可以线性化。rotate()从指定的迭代器位置旋转整个容器。
circular_buffer_space_optimized是circular_buffer的适配器,circular_buffer是在其定义的时候就分配好了内存,而circular_buffer_space_optimized只有在确实需要时(比如插入元素时)才分配内存,且容器内元素减少时也会自动释放内存。
需要注意的是circular_buffer的迭代器不是循环的,超过end()也会引发断言异常:
#include "boost\circular_buffer.hpp" using namespace boost; circular_buffer<int> cb(5);//定义大小为5的循环容器 cb.push_back(1); cb.push_front(0); BOOST_AUTO(pos, cb.begin());//需包含"boost\typeof\typeof.hpp" for (; pos != cb.end(); pos++)//遍历循环容器 cout << *pos << endl; cout << *(pos + 10) << endl;//迭代器超过end(),出错!
5、dynamic_bitset
dynamic_bitset类似bitset,但它可以动态改变长度。dynamic_bitset也不是容器 ,其不支持迭代器和assign库等STL操作。
#include "boost/dynamic_bitset.hpp" using namespace boost; ....... dynamic_bitset<> db1; //空的dynamic_bitset
6、multi_array
multi_array是多维容器,它使用起来比vector< vector<T> >这种方式更方便。
——本文引用和参考出处:《boost程序库完全开发指南》.罗剑锋
以上是关于boost-容器的主要内容,如果未能解决你的问题,请参考以下文章
boost::interprocess 不在共享内存副本中的容器容器
boost::interprocess scoped_allocator AND 不在共享内存中的容器的容器