1. 程式人生 > >C++ ---- 順序容器(二)

C++ ---- 順序容器(二)

2 順序容器操作

除了array外,所有標準庫容器都提供靈活的記憶體管理。

插入元素

 注意:

1. 其中 c.insert(p,b,e) 中,迭代器 b 和 e 不能指向c中元素。

2. 向一個vector 或 string 新增元素可能引起整個物件儲存空間的重新分配。(重新分配一個物件的儲存空間需要分配新的記憶體,並將元素從舊的空間移動到新的空間中。)

3. 元素容器是拷貝。將一個物件放入容器中,都是指將物件拷貝到容器中。

emplace:(待續)

C++11中,針對順序容器(如vector、deque、list),新標準引入了三個新成員:emplace_front、emplace 和 emplace_back,這些操作構造而不是拷貝元素。這些操作分別對應push_front、insert和push_back,允許我們將元素放置在容器頭部、一個指定位置之前或容器尾部。

當呼叫push或insert成員函式時,我們將元素型別的物件傳遞給它們,這些物件被拷貝到容器中。而當我們呼叫一個emplace成員函式時,則是將引數傳遞給元素型別的建構函式。emplace成員使用這些引數在容器管理的記憶體空間中直接構造元素。 例如,假定 c 儲存Sales_data元素:

 // 在c的末尾構造一個Sales_data物件

 // 使用3個引數的Sales_data建構函式

c.emplace_back("978-0590353403", 25, 15.99);

 // 錯誤:沒有接受三個引數的push_back版本

c.push_back("978-0590353403", 25, 15.99);

 // 正確:建立一個臨時的Sales_data物件傳遞給push_back

c.push_back(Sales_data("978-0590353403", 25, 15.99));

emplace函式的引數根據元素型別而變化,引數必須與元素型別的建構函式相匹配。emplace函式在容器中直接構造元素。傳遞給emplace函式的引數必須與元素型別的建構函式相匹配。

emplace 相關函式可以減少記憶體拷貝和移動。當插入rvalue,它節約了一次move構造,當插入lvalue,它節約了一次copy構造。

// iter 指向 c 中一個元素,其中儲存了Sales_data 元素

c.emplace_back();   // 使用Sales_data 的預設建構函式

c.emplace(iter, "999-999999999");   // 使用 Sales_data(string)

// 使用 Sales_data 的接受一個ISBN、一個count 和一個price 的建構函式

c.emplace_front("978-0590353403", 25, 15.99);

訪問元素

包括 array 在內的每個順序容器都有一個front 成員函式,而除 forward_list 之外的所有順序容器都有一個back 成員函式。這兩個操作分別返回首元素尾元素的引用。

注意:

1. 迭代器 end 指向的是容器尾元素之後的(不存在的)元素,因此,若要指向最後一個元素需向前移動一位。

2. 若需使用  auto 變數來儲存 front 和 back 成員函式返回值,並需希望使用該變數來改變元素的值,必須要將變數定義為引用型別: auto &v = c.back();

z

 刪除元素

什麼是失效?

vector <int> n = {1,2,3,4,5};

start = n.begin()+2;

n.erase(n.begin+1);

start 就失效了。

參考:

emplace: