public member function
<deque>

std::deque::emplace

template <class... Args>  iterator emplace (const_iterator position, Args&&... args);
Construct and insert element
通过在position处插入一个新元素来扩展容器。此新元素使用args作为其构造函数的参数就地构造。

这会将容器的 size 有效地增加一。

双端队列被设计为在序列的开头或结尾高效地执行插入(和删除)操作。在其他位置的插入通常不如 listforward_list 容器高效。有关直接在开头或结尾扩展容器的成员函数,请参阅 emplace_frontemplace_back

通过调用 allocator_traits::construct 并转发 args 来就地构建元素。

参数

position
新元素插入到容器中的位置。
成员类型const_iterator是一种指向常量元素的 随机访问迭代器 类型。
args
转发给构造新元素的参数。

返回值

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

成员类型iterator是一种指向元素的 随机访问迭代器 类型。

新元素的存储使用allocator_traits<allocator_type>::construct()分配,这在失败时可能会抛出异常(对于默认的 allocatorbad_alloc如果分配请求不成功,则抛出)。

示例

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

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

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

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

  return 0;
}
输出
mydeque contains: 10 200 100 20 30 300


复杂度

根据具体的库实现,可能与 positiondeque 的某个末尾之间的元素数量呈线性关系。

迭代器有效性

如果插入发生在序列的开头或结尾,所有与此容器相关的迭代器都会失效,但指针和引用保持有效,指向调用前它们所指向的相同元素。
如果插入发生在 deque 的任何其他位置,所有与此容器相关的迭代器、指针和引用都会失效。

数据竞争

容器被修改。
如果插入发生在序列的开头或结尾,则不会访问任何包含的元素(但请参阅上面的“迭代器有效性”)。
如果发生在其他任何地方,则并发访问元素不安全。

异常安全

如果 positionbeginend,则在发生异常时容器不会改变(强保证)。
否则,容器保证以有效状态结束(基本保证)。
如果不支持具有适当参数的 allocator_traits::construct,或者 position 无效,则会导致未定义行为

另见