Boost原始碼學習三 實用工具 (4)

2021-07-08 12:45:42 字數 2489 閱讀 6817

第四個是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...