public member function
<forward_list>

std::forward_list::insert_after

(1)
iterator insert_after ( const_iterator position, const value_type& val );
(2)
iterator insert_after ( const_iterator position, value_type&& val );
(3)
iterator insert_after ( const_iterator position, size_type n, const value_type& val );
(4)
template <class InputIterator>  iterator insert_after ( const_iterator position, InputIterator first, InputIterator last );
(5)
iterator insert_after ( const_iterator position, initializer_list<value_type> il );
插入元素
該容器透過在position指定元素之後插入新元素來擴充套件。

這會有效地將容器大小增加插入元素的數量。

與其他標準序列容器不同,listforward_list容器專門設計用於在任何位置(即使在序列中間)高效地插入和刪除元素。

存在一個類似的成員函式 emplace_after,它直接在原地構造插入的元素物件,而無需執行任何複製或移動操作。

引數決定了插入多少元素以及如何初始化它們的值。

引數

position
插入新元素的位置,位於容器中。新元素將被插入到該元素之後。
成員型別const_iterator是一種指向元素的前向迭代器型別。
val
將被複制(或移動)到插入元素的值。
成員型別value_type是容器中元素的型別,在forward_list中定義為其第一個模板引數(T).
n
要插入的元素數量。每個元素都將使用*val*的副本進行初始化。
成員型別size_type是一種無符號整型型別。
first, last
指定元素範圍的迭代器。範圍中元素的副本[first,last)將被插入到*position*(按相同順序)。
請注意,範圍包括 first 和 last 之間的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
函式模板引數InputIterator應為指向某種型別元素的輸入迭代器型別,該型別可以被轉換為value_type物件的型別的元素。
il
一個initializer_list物件。這些元素的副本將被插入到*position*(按相同順序)。
這些物件是從初始化列表宣告符自動構造的。
成員型別value_type是容器中元素的型別,在forward_list中定義為其第一個模板引數(T).

返回值

指向新插入的最後一個元素的迭代器,如果未插入元素,則為position

成員型別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
21
22
23
24
25
26
// forward_list::insert_after
#include <iostream>
#include <array>
#include <forward_list>

int main ()
{
  std::array<int,3> myarray = { 11, 22, 33 };
  std::forward_list<int> mylist;
  std::forward_list<int>::iterator it;

  it = mylist.insert_after ( mylist.before_begin(), 10 );          // 10
                                                                   //  ^  <- it
  it = mylist.insert_after ( it, 2, 20 );                          // 10 20 20
                                                                   //        ^
  it = mylist.insert_after ( it, myarray.begin(), myarray.end() ); // 10 20 20 11 22 33
                                                                   //                 ^
  it = mylist.begin();                                             //  ^
  it = mylist.insert_after ( it, {1,2,3} );                        // 10 1 2 3 20 20 11 22 33
                                                                   //        ^

  std::cout << "mylist contains:";
  for (int& x: mylist) std::cout << ' ' << x;
  std::cout << '\n';
  return 0;
}
輸出
mylist contains: 10 1 2 3 20 20 11 22 33


複雜度

線性複雜度,與插入的元素數量(複製/移動構造)成正比。

迭代器有效性

沒有變化。

資料競爭

容器被修改。
沒有訪問包含的元素。同時訪問或修改不同的元素是安全的,但迭代包含position的範圍則不是。

異常安全

強保證:如果丟擲異常,容器沒有發生變化。
如果不支援具有適當引數的allocator_traits::construct進行元素構造,或者指定了無效的*position*或範圍,則會導致*未定義行為*。

另見