public member function
<vector>

std::vector::emplace

template <class... Args>iterator emplace (const_iterator position, Args&&... args);
構造並插入元素
透過在position處插入一個新元素來擴充套件容器。此新元素使用args作為其建構函式的引數就地構造。

這會將容器的size有效地增加一。

僅當新的vector size 超過當前vector capacity 時,才會發生已分配儲存空間的自動重新分配。

由於vector使用陣列作為底層儲存,因此在vector末尾以外的位置插入元素會導致容器將其後的所有元素向後移動一個位置。與list或forward_list等其他序列容器相比,這通常是一個效率較低的操作。有關直接在末尾擴充套件容器的成員函式emplace_back,請參見emplace_back

透過呼叫轉發argsallocator_traits::construct就地構造元素。

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

引數

position
新元素插入到容器中的位置。
成員型別const_iterator是一種指向const元素的隨機訪問迭代器型別。
args
轉發給構造新元素的引數。

返回值

指向新插入元素的迭代器。

成員型別iterator是一種指向元素的隨機訪問迭代器型別。

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

示例

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

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

  auto it = myvector.emplace ( myvector.begin()+1, 100 );
  myvector.emplace ( it, 200 );
  myvector.emplace ( myvector.end(), 300 );

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

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


複雜度

position之後的元素數量上呈線性(移動)。

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

迭代器有效性

如果發生重新分配,則所有與該容器相關的迭代器、指標和引用都將失效。
否則,只有指向position及之後元素的迭代器、指標和引用會失效,而指向position之前元素的迭代器、指標和引用則保證保持指向呼叫前它們所指向的相同元素。

資料競爭

容器已被修改。
如果發生重新分配,則所有包含的元素都將被修改。
否則,不訪問position之前的任何元素,同時訪問或修改它們是安全的。

異常安全

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

另見