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-容器

boost::interprocess scoped_allocator AND 不在共享内存中的容器的容器

boost实用工具:assign库了解学习

有没有办法获取有关 boost::flyweight 内部容器的信息?

Boost库初见