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 不支持相应的参数,则会导致*未定义行为*。

另见