記住,向容器中新增元素的唯一方式是使用它的成員函數。如果不呼叫成員函數,非成員函數既不能新增也不能刪除元素。這意味著容器物件必須通過它所允許的函數去存取,疊代器顯然不行。
可以通過使用容器物件的 push_back() 函數,在序列的末尾新增一個元素。例如:
std::vector<double> values;
values.push_back(3.1415926);
在這個範例中,push_back() 函數以傳入的引數 -3.1415926 作為新元素的值,然後把它新增到現有元素的後面。因為這裡並沒有現有的元素,所以這個元素就是第一個元素。如果沒有呼叫 reserve(),容器就會為這個新元素分配記憶體。這裡,第二個版本的 push_back() 使用了右值參照引數,這樣就可以通過移動運算來新增元素。例如:
std::vector<std::string> words;
words.push_back(string("adiabatic"));
// Move string("adiabatic") into the vector
這裡 push_back() 的引數是一個臨時物件,因此這會呼叫右值參照版的函數。當然,也可以這樣寫:
words.push_back ("adiabaticft"); // Move string("adiabatic") into the vector
編譯器會生成一個以"adiabatic”為初值的 string 物件,然後這個物件會像前面那樣移動到 vector 中。
還有一個更好的方法來新增元素。emplace back() 比 push_back() 更有效率。下面這個程式碼片段說明了為什麼:
std::vector<std::string> words;
words.push_back (std:: string ("facetious") ) ; // Calls string constructor & moves the string object
words•emplace_back("abstemious");// Calls string constructor to create element in place
emplace_back() 的引數正是新增到容器中的物件的建構函式所需要的引數。emplace_back() 用它的引數作為建構函式的引數,在容器中生成物件。如果不想使用移動運算,這個範例中就要使用 push_back()。可以在 emplace_back() 函數中使用盡可能多的引數,只要它們滿足物件建構函式的要求。這裡有一個使用多引數的 emplace_back() 的範例:
std::string str {"alleged"};
words.emplace_back(str, 2, 3);
// Create string object corresponding to "leg" in place
emplace_back() 函數會呼叫接收三個引數的 string 建構函式,生成 string 物件,然後把它新增到 words 序列中。建構函式會生成一個從索引 2 幵始、包含 str 中三個字元的子串。