简单介绍Boost库中的容器

1.array:
模板类array本质上是一个对静态数组的包装,只能应用在已知数组大小或者对运行速度要求很高的场合。如果需要可动态变动容量的数组,可使用std::vector或boost::scoped_array
缺陷:

  • 没有构造函数,不能指定大小和初始值(只能用模板参数指定大小)
  • 没有push_back()和push_front(),因为它不能动态增长;
  • 不能搭配插入迭代器适配器功能,同样因为它不能动态增长
    2.dynamic_bitset
    C++98标准为处理二进制数值提供了两个工具:vector<bool>和bitset.
    vector<bool>是对元素类型为bool的vector特化,它内部并不真正存储bool值,而是以bit来压缩保存、使用代理计数来操作bit,造成的后果是它很像容器,大多数情况下的行为与标准容器一直,但它不是容器,不满足容器的定义。
    bitset与vector<bool>类似,同样存储二进制位,但它的大小固定,而且比vector<bool>支持更多的位运算。
    vector<bool>和bitset各有优缺点:vector<bool>可以动态增长,但不能方便的进行位运算;bitset正好相反,可以方便地对容纳的二进制位做运算,但不能动态增长。
    boost.dynamic_bitset恰好填补了两者之间的空白,它类似标准库的bitset,提供丰富的位运算,同时长度又是动态可变的。
    3.unordered
    unordered库提供了一个完全符合C++新标准草案的散列容器实现,包括无序集合(set)和无序映射(map)。内部使用散列表代替了二叉树实现,查找复杂度为常数。
    4.bimap
    C++标准提供了映射型容器map和muti_map,它们像是一个关联数组,把一个元素(key)映射到另一个元素(value),但这种映射关系是单向的,只能是key到value,而不能反过来。
    boost.bimap扩展了标准库的映射型容器,提供双向映射的能力,功能强大。
    bimap可以容纳两个类型的元素,是这两种元素关系的集合,这时bimap的基本视图。此外这个关系还可以有两个试图:左视图和右视图,分别用成员变量left和right访问,相当于两个不同方向的std::map,其用法也和std::map一样。
    对于bimap<X,Y>,bimap.left相当于map<X,Y>,bimap.right相当于map<Y,X>
    5.circular_buffer:
    circual_buffer实现了循环缓冲区的数据结构,支持标准的容器操作(如push_back),但大小是固定的,当到达容器末尾时将自动循环利用荣i去另一端的空间。
    circual_buffer的特殊之处在于它的内部存储数据的方式,内存空间不是动态增长的,而是循环使用的,可以把circual_buffer内部想象成一个首尾相连的环,当元素数量达到容器的容量上限时自动宠用最初的空间。
    6.tuple:
    tuple定义了一个有固定数目元素的容器,其中的每个元素类型都可以不相同,这与其他容器有着本质的区别。例如标准容器std::vector或boost::array虽然可以容纳很多元素,但所有的元素都必须时同一类型。tuple是std::pair的泛化,可以从函数返回任意数量的值,也可以代替struct组合数据。
    7.any:
    any是一种很特殊的容器(不是一个模板类),它只能容纳一个元素,但这个元素可以是任意类型——int、double、string、STL容器或者任何的自定义类型。程序可以用any保存任意的数据,在任何需要它的时候将它取出。这种功能与shared_ptr<void>有些类似,但any是类型安全的。
    8.variant:
    variant与any有些类似,是一种可变类型,是对C/C++中union的增强和扩展。浦东的union只能持有POD(普通数据类型),而不能持有如string、vector等复杂类型,variant则没有这个限制。
    variant和any的区别:

  • any不是模板类,而variant是模板类;

  • variant是有界类型,元素类型范围由用户指定,而any则是无界类型,可以容纳任意的类型;
    any虽然功能比variant强,但无法替代variant:
    any任意类型的自由往往意味着程序员更多的责任,就像void*指针,灵活弹药付出更多的安全检查代价。variant的有界类型将取值类型限定在一个较小的范围,因而更容易处理、理解。因为所有允许的类型都在模板参数列表中指定,variant可以在编译期进行类型检查,充分利用C++作为静态强类型语言的好处。
    9.multi_array:
    10.property_tree:
    property_tree是一个保存了多个属性值的树形数据结构,可以用类似路径的简单方式访问任意节点的属性,而且每个节点都可以用类似STL的风格遍历子节点。property_tree特别适合于应用程序的配置数据处理,可以解析XML、ini、json和info四种格式的文本数据,使用它能够减轻自己开发配置管理的工作。
    property_tree内部使用的是一个小巧快速的开源XML解析器—-rapidxml
发布了46 篇原创文章 · 获赞 13 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/luliuliu1234/article/details/80560889