第四個是assign,
#include using namespace std;
#include /*assign:
許多情況下我們都需要為容器初始化或者賦值,填入大量的資料,比如初始錯誤**和錯誤資訊,或者是一些測試用的資料。stl容器僅提供了容納這些資料的方法,但填充的步驟卻是相當地麻煩,必須重複呼叫insert()或者push_back()等成員函式,這正是boost.assign出現的理由.
assign庫過載了賦值操作符,operator += , 逗號操作符operator, 和括號操作符operator(), 可以用難以想象的簡潔語法非常方便地對stl容器賦值或者初始化,在需要填入大量初值的地方很有用。
#include using namespace boost::assign;
使用操作符 += 向容器增加元素
boost.assign,由於過載了操作符 += 和逗號,可以用簡潔到令人震驚的語法完成原來用許多**才能完成的工作。
使用assign庫時必須使用using指示符,只有這樣才能讓過載的 += ,等操作符在作用域內生效
*/void case1()
/*括號操作符也可以與逗號等操作符配合使用
*/void case3()
/*初始化容器元素:
操作符+=和()解決了對容器的賦值問題,但有的時候需要在容器構造的時候就完成資料的填充,
這種方式較賦值更為高效。c++內建的陣列和標準字串類string支援這樣做,但stl容器則不行。
assign庫使用list_of(),map_list_of()/pair_list_of()和tuple_list_of()三個函式解決了這個問題.
list_of:
list_of()函式的用法與之前的insert(),push_back()等函式很相似,也過載了括號,逗號操作符。
它很智慧型,返回乙個匿名的列表,可以賦值給任意容器。
*/void case4()
mapm = list_of(make_pair(1, "one"))(make_pair(2, "two"));
// m = [(1, 「one」) (2, 「two」)]
mapm1 = map_list_of(1, 2)(3, 4)(5, 6);
//m1 = [(1, 2)(3, 4)(5, 6)]
mapm2 = map_list_of(1, "one")(2, "two");
//m2 = [(1, "one")(2, "two")]}/*
減少重複輸入:
assign庫提供repeat(),repeat_fun()和range()三個函式來減少重複的輸入;
repeat()函式把第二個引數作為要填入的值,重複第乙個引數指定的次數,
與vector,deque等容器的建構函式很相似,repeat_fun()函式同樣重複
第乙個引數的次數,但第二個引數是個無參的函式或函式物件,它返回填
入的數值;range()函式則可以把乙個序列全部或部分元素插入到另乙個
序列裡。
*/#include //for rand()
void case5()
/*與非標準容器工作:
assign庫不僅支援全部八個stl標準容器
(vector,string,deque,list,set,multiset,map,multimao),
也對stl中的容器介面卡提供了適當的支援,包括stack,queue和priority_queue.
因為stack等容器介面卡不符合容器的定義,沒有insert,push_back等成員函式,
所以不能使用賦值的方式填入元素,只能使用初始化的方式,並在list_of表示式
最後使用to_adapter()成員函式來適配到非標準容器。如果使用逗號操作符還需
要把整個表示式用括號括起來,才能使用點號呼叫to_adapter().
*/#include #include void case6()
cout << endl;
queueq = (list_of("china")("us")("uk")).
repeat(2, "russia").to_adapter();
push(q)("germany");
for(;!q.empty();)
cout << endl;
priority_queuepq = (list_of(1.414), 1.732, 2.236).to_adapter();
push(pq),3.414,2.71828;
for(;!pq.empty();)
}/*引用初始化列表:
在list_of之外assign庫還有兩個類似功能的ref_list_of()和
cref_list_of(),這兩個函式接受變數的引用作為引數來建立初始
化匿名列表,較list_of()的效率更高.
*/void case7()
int main()
Boost原始碼學習三 實用工具 (2)
第二個學習的是ignore unused,template inline void ignore unused ts const ignore unused使用可變引數模板,可以支援任意數量,任意型別的變數,把它們作為函式的引數 使用 了一下,騙過了編譯器,達到了與 void var相同的效果。in...
Boost原始碼學習三 實用工具 (3)
第三個學的是optional,按照boost程式庫開發指南中的介紹 optional的類摘要 template class t class optional optional庫使用 容器 語義,包裝了 可能產生無效值 的物件,實現了 未初始化 的概念.include using namespace ...
boost之實用工具
1.noncopyable用於禁止複製和拷貝的類繼承。宣告拷貝和賦值函式為私有,將執行時的錯誤轉化為編譯期的錯誤。include include using namespace std using namespace boost class mynoncopy private mynoncopy c...