public member function
<forward_list>

std::forward_list::emplace_after

template <class... Args>  iterator emplace_after (const_iterator position, Args&&... args);
构造并插入元素
通过在 position 指定的元素之后插入新元素来扩展容器。此新元素使用 args 作为其构造函数的参数就地构造。

这会有效地将容器大小增加一。

与其他标准序列容器不同,listforward_list容器专门设计用于在任何位置(即使在序列中间)高效地插入和删除元素。

要在 forward_list 的开头插入元素,请使用成员函数 emplace_front,或将 before_begin 作为 position 调用此函数。

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

存在一个类似的成员函数 insert_after,它将现有对象复制或移动到容器中。

参数

position
在新元素插入之后容器中的位置。
成员类型const_iterator是一个指向 const 元素的 forward iterator 类型。
args
转发给构造新元素的参数。

返回值

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

成员类型iterator是一个指向元素的 forward 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
20
// forward_list::emplace_after
#include <iostream>
#include <forward_list>

int main ()
{
  std::forward_list< std::pair<int,char> > mylist;
  auto it = mylist.before_begin();

  it = mylist.emplace_after ( it, 100, 'x' );
  it = mylist.emplace_after ( it, 200, 'y' );
  it = mylist.emplace_after ( it, 300, 'z' );

  std::cout << "mylist contains:";
  for (auto& x: mylist)
    std::cout << " (" << x.first << "," << x.second << ")";

  std::cout << '\n';
  return 0;
}
输出
mylist contains: (100,x) (200,y) (300,z)


复杂度

常量。

迭代器有效性

没有变化。

数据竞争

容器已修改。
未访问容器内的任何元素:并发访问或修改它们是安全的,尽管迭代包含 position 的范围是不安全的。

异常安全

强保证:如果抛出异常,容器没有发生变化。
如果不支持具有适当参数的 allocator_traits::construct,或者 position 无效,则会导致未定义行为

另见