libboost一些常用库(数据结构,迭代器,算法及字符串)

版权声明:本文为博主原创文章,只要标明出处即可转载。 https://blog.csdn.net/ariesjzj/article/details/51923337

原文地址:http://blog.csdn.net/jinzhuojun/article/details/51923337


C++强大的重要原因之一就是它的库。而boost就是这样一个包罗万象的C++库,同时它也是C++标准库的官方后备军。不仅实用,功能全,而且灵活,高效,质量高。无论是学习或项目,都是有力的工具。下面罗列了容器、算法等几个重要类别下的主要子库。其中的一些已经是目前比较主流的C++11标准,有些在进入标准库的过程中,未来可能成为标准库的一部分。有些虽然进了标准库,但boost中的实现提供了额外的特性。总之,在boost中可以看到C++标准发展的一些趋势。



数据结构,容器和迭代器
Any(Not C++11)
通过type erasure技术实现的可以存放任意类型的类型。类型boost::any的变量可以通过boost::any_cast<type>来转化成相应类型,如果类型与之前不匹配会抛出boost::bad_any_cast异常。boost::any大量使用内存动态分配,RTTI和虚函数,对性能可能会有影响。

Variant(Not C++11)
C++03 unions只能放POD,C++11可以放类似于std::string的对象,但需要自己管理构建和销毁,因此需要显示记录union里放的是什么,这样用起来就很累。为了克服这个缺点,boost::variant它维护了数组,编译期决定该数组长度。在赋值或是构造时,这些对象被in-place方式销毁,然后通过placement new创建。同样是基于type erasure技术,它不需要RTTI,效率上比Any快。配合boost::apply_visitor()可以实现visitor模式。

Array(C++ 11)
元素为同样类型的数组的模板类,包含个数信息。与vector等容器相比,它的元素个数动态不能变。它拥有和STL容器类似的成员函数。提供这些优点的同时,性能又和C数组相当。

Tuple(C++11)
与std::pair类似,只是它可以表示多元组。与array不同的是其中的元素类型可以不同。用make_tuple()创建。用boost::tie()可以创建元组的nonconst reference,这样可以作为lvalue用于赋值等。tuple主要是为了简化template programming。如果一个结构体只用一两次,就不用定义成struct了。

Unordered(C++11)
提供了unordered_map, unordered_set等基于hash表的容器实现,对于要经常查找的场合比较适用。

Bitmap(Not C++11)
不是位图库,是用于value同时也是key的容器。大部分的用于索引的容器都是<key, value>的结构,但有时希望元素中的两个值互为索引。当然你可以选择用两个容器替代它,但一般来说会用更多内存。

MultiIndex(Not C++11)
用于可以有多个index的容器,类似于数据库中的表。可以指定每个index的属性,比如unique,sorted等。

Container(Not C++11)
提供一些五花八门的容器,比如stable_vector, slist(C++11有类似的forward_list), static_vector, small_vector, flat_[multi]map/set(基于vector实现的set和map)等。

ICL(Not C++11)
提供了两种基于interval的容器:interval_set和interval_map。它们可以方便地存放interval元素并对其进行相应操作。

Circular Buffer(Not C++11)
通用的循环缓冲实现。有空间优化版本(Lazily分配内存)。

Dynamic Bitset(C++11)
用于表示一系列的bit位。重载operator[]使之可以方便地访问其中某一bit,另外还有如&, |, <<等各种bitwise operator提供。C++11中的std::bitset和它很类似。

Intrusive(Not C++11)
Intrusive的数据结构在c中被大量使用。而相较而言,C++中,比如STL中的容器大多不是intrusive的,即其中的元素不用包含用于容器管理的数据。该库提供了基于intrusive的如list, set, splaytree, treap, rbtree, hashtable, avltree等数据结构。

MultiArray(Not C++11)
用于多维数组,即矩阵的存储和处理。比C++中类似std::array<std::array<int, n>, m>或std::vector<std::vector<>>的方式更方便高效。

Property Map(Not C++11)
最初来源于Boost Graph Library中,需要property map接口来访问图中顶点和边的相关数据。后来发展成通用库用于描述模板参数需求的工具。本质上它是基于下层数据结构(如std::map)的用于映射key object到value object的一系列concept。

Property Tree(Not C++11)
提供了树型的数据存储结构,其中的元素可以通过path来查找,有点像trie树。尤其适合configuration数据的处理。还可以方便得从XML, JSON文件中解析和生成树型结构。

Heap(Not C++11)
priority queue的实现。与STL中的std::priority_queue相比,它提供了更多功能及更多特性(如可遍历,可合并,可比较,可变,稳定等 )。

PointerContainer(Not C++11)
包含了ptr_array, ptr_vector, ptr_set, ptr_multimap等,用于将堆分配的对象指针放在容器内。用它可以免除自己定义compare函数,也可以少加reference操作,使代码更简洁。

Range(Not C++11)
提供了用两个iterator表示数据结构子部分的方法。比如表示子字符串,这样可以有效避免拷贝。同时提供了比如copy, merge, remove, rotate, reverse, replace, transform等通用算法。


算法 
Geometry(Not C++11)
该库主要用于解决几何问题。算法涉及segment, multi_point, centroid, convex hull, bounding box等,提供了R-Tree等数据结构的实现。在游戏开发,图形学,机器人等众多领域都能用到。

Algorithm(Partially C++11)
提供了all_of, any_of, partition_copy,KMP,min-max等基本通用算法。其中很多已是C++11标准。

Polygon(Not C++11)
提供关于平面多边形几何数据的算法 。比如多边形集合的各种集合运算, connectivity extraction,  sweep line algorithm(for Voronoi diagrams)等算法。这些算法在GIS, CAD,VLSI等领域起到很大作用。

Sort(Not C++11)
提供了高性能排序的一种通用实现spreadsort,并对几种常见数据类型作了specialization。它是一种采用了radix和基于比较排序的混合算法,比标准库里的std::sort()在大多数情况下更高效(元素个数多或者大,本来有序,比较函数慢等情况)。

Graph(Not C++11)
实现了一些常用的图算法,比如拓扑排序,BFS, DFS, Dijkstra shortest path等等。配合Graphviz等工具还可以将数据图形化。



字符串处理
LexicalCast(Not C++11) & NumericConversion(Not C++11) & Convert (Not C++11)
boost::lexical_cast用于字符串到整数类型,或者相反方向的转换。当失败时抛boost::bad_lexical_cast异常。与同类方法相比,它比C中的strtol有更少的限制,比scanf更安全易用,比C++中的stringstream更简洁。 配合std::locale还可以根据localization进行转换。
std::numeric_cast用于数字到数字的转换,用于替换static_cast,这样如果转换失败会抛异常(比如overflow)。
Convert在LexcalCast的概念上扩展了它的功能,比如format和locale支持,更好的错误检测等。

StringAlgorithm(Not C++11)
提供了一系列字符串相关的算法 。比如case insensitive comparison,search/replace,split,trim等功能。

Spirit(Not C++11)
它可以用于写文本的parser。相比bison等专业的工具,它更轻量级。语法类似于EBNF。

RegEx(C++11)
正则表达式处理。用boost::regex可以动态生成对象进行正则表达式的解析和编译,也可以做基于正则表达式的替换和查找。

Tokenizer(Not C++11)
更灵活易用的方法将字符串分割成token。它将tokenizer的policy抽象成TokenizerFunction,并且提供几种model分别基于char, excaped list和offset。它比C中的strtok提供更细致的控制。

Locale(Not C++11)
提供跨平台的本地化支持。

Xpressive(Not C++11)
正则表达式模板库。支持运行时或编译时的正则表达式处理,还支持递归定义。


猜你喜欢

转载自blog.csdn.net/ariesjzj/article/details/51923337