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 无效,则会导致未定义行为

另见