boost一些常用库(数据结构,迭代器,算法及字符串) 简单介绍
原文地址: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)
正則表達式模板庫。支持運行時或編譯時的正則表達式處理,還支持遞歸定義。
總結
以上是生活随笔為你收集整理的boost一些常用库(数据结构,迭代器,算法及字符串) 简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对unicode数据进行部分replac
- 下一篇: MySQL组提交(group commi