public member function
<vector>

std::vector::emplace_back

template <class... Args>  void emplace_back (Args&&... args);
在list的末尾構造並插入元素
在 vector 的末尾插入新元素,緊挨在當前最後一個元素之後。新元素透過呼叫其建構函式就地構造,引數為 args

這會使容器的 size 自動增加一。如果新 vector size 超過了當前的 vector capacity,則會自動重新分配所分配的儲存空間(僅在此情況下)。

透過呼叫 allocator_traits::construct 並轉發 args 引數來就地構造元素。

還有一個類似的成員函式 push_back,它複製或移動一個已存在的物件到容器中。

引數

args
轉發給構造新元素的引數。

返回值

無。

如果發生重新分配,儲存將使用容器的allocator進行分配,這可能會在失敗時丟擲異常(對於預設allocatorbad_alloc如果分配請求不成功,則丟擲)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// vector::emplace_back
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30};

  myvector.emplace_back (100);
  myvector.emplace_back (200);

  std::cout << "myvector contains:";
  for (auto& x: myvector)
    std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}
輸出
myvector contains: 10 20 30 100 200


複雜度

常量(攤銷時間,可能會發生重新分配)。

如果發生重新分配,重新分配本身最多與整個size呈線性關係。

迭代器有效性

如果發生重新分配,所有與該容器相關的迭代器、指標和引用都將失效。
否則,只有 end 迭代器失效,所有其他迭代器、指標和指向元素的引用將保證繼續指向它們在呼叫之前所指向的相同元素。

資料競爭

容器已被修改。
如果發生重新分配,則所有包含的元素都將被修改。
否則,不會訪問現有元素,併發訪問或修改它們是安全的(但請參見上面的*迭代器有效性*)。

異常安全

如果沒有發生重新分配,則在發生異常時容器不會改變(強保證)。
如果發生重新分配,當元素的型別是可複製無異常移動時,也提供強保證。
否則,容器保證處於有效狀態(基本保證)。
如果 allocator_traits::construct 不支援相應的引數,則會導致*未定義行為*。

另見