六一的部落格


关关难过关关过,前路漫漫亦灿灿。



insert iterator

之前在写容器元素算法中了解到fill和fill_n, 以及二者与插入迭代器配合, 可以往容器中添加元素

调用操作获取迭代器, 使用类型说明符给出迭代器类型

1C c;
2auto it = back_inserter(c);

三种获取插入迭代器的操作, 区别在于元素插入的位置

获取迭代器操作 插入元素实现
back_inserter 使用push_back
front_inserter 使用push_front
inserter 使用insert

只考虑用于顺序容器


插入迭代器支持的操作

使用迭代器it插入元素, 为t的拷贝

1it = t;

其他

以下操作存在, 但不会对it做任何事情. 返回it

1*it;
2
3++it;
4
5it++;

back_inserter操作

返回调用push_back插入元素的迭代器

要求容器支持push_back操作

顺序容器 是否支持
vector(string) O
deque O
list O
forward_list X
1C c;
2auto it = back_inserter(c);
3
4*it = val;
5
6// <=>
7// c.push_back(val);

示例

1vector<int> vec;
2auto it = back_inserter(vec);
3*it = 42;        // 往vec插入一个元素,值为42

front_inserter操作

返回调用push_front插入元素的迭代器

要求容器支持push_front操作

顺序容器 是否支持
vector(string) X
deque O
list O
forward_list O
1C c;
2auto it = front_inserter(c);
3
4*it = val;
5
6// <=>
7// c.push_front(val);

示例

1list<int> lst = {1, 2, 3, 4};
2list<int> lst2;
3
4copy(lst.cbegin(), lst.cend(), front_inserter(lst2));
5
6// lst2 = {4, 3, 2, 1};

inserter操作

第1种描述: 返回在给定位置插入元素的迭代器; 添加元素后, it指向给定位置的下一位置

第2种描述: 传入指向元素的迭代器, 每次在该元素之前插入新元素

要求容器支持insert操作

顺序容器 是否支持
vector(string) O
deque O
list O
forward_list X
1it = inserter(c, iter);
2
3*it = val;
4
5// <=>
6// it = c.insert(it, val);
7// ++it;

多次使用it插入元素,it所指元素不变,总是在该元素之前插入元素


示例

1list<int> lst = {1, 2, 3, 4};
2list<int> lst3;
3
4copy(lst,cbegin(), lst.cend(), inserter(lst3, lst3.begin());
5
6// lst3为空,lst.begin() == lst.end() == 尾后迭代器
7// lst3 = {1, 2, 3, 4};

对插入迭代器执行解引用操作的好处

  1. 与其他迭代器的使用保持一致
  2. 可以增加代码可读性
 1vector<string> words = {"hello", "world", "!!!"};
 2
 3auto it = words.begin() + 1;    // world
 4
 5auto iter = inserter(words, it);
 6
 7*iter = "my";    // words = {"hello", "my", "world", "!!!"}。在world之前插入元素
 8
 9*iter = "work";    // words = {"hello", "my", "work", "world", "!!!"}。在world之前插入元素
10
11cout << *it << endl;        // world
12
13cout << *iter << endl;        // 错误:*iter返回iter,无法输出迭代器

迭代器适配器: 插入迭代器


insert iterator

之前在写容器元素算法中了解到fill和fill_n, 以及二者与插入迭代器配合, 可以往容器中添加元素

调用操作获取迭代器, 使用类型说明符给出迭代器类型

1C c;
2auto it = back_inserter(c);

三种获取插入迭代器的操作, 区别在于元素插入的位置

获取迭代器操作 插入元素实现
back_inserter 使用push_back
front_inserter 使用push_front
inserter 使用insert

只考虑用于顺序容器


插入迭代器支持的操作

使用迭代器it插入元素, 为t的拷贝

1it = t;

其他

以下操作存在, 但不会对it做任何事情. 返回it

1*it;
2
3++it;
4
5it++;

back_inserter操作

返回调用push_back插入元素的迭代器

要求容器支持push_back操作

顺序容器 是否支持
vector(string) O
deque O
list O
forward_list X
1C c;
2auto it = back_inserter(c);
3
4*it = val;
5
6// <=>
7// c.push_back(val);

示例

1vector<int> vec;
2auto it = back_inserter(vec);
3*it = 42;        // 往vec插入一个元素,值为42

front_inserter操作

返回调用push_front插入元素的迭代器

要求容器支持push_front操作

顺序容器 是否支持
vector(string) X
deque O
list O
forward_list O
1C c;
2auto it = front_inserter(c);
3
4*it = val;
5
6// <=>
7// c.push_front(val);

示例

1list<int> lst = {1, 2, 3, 4};
2list<int> lst2;
3
4copy(lst.cbegin(), lst.cend(), front_inserter(lst2));
5
6// lst2 = {4, 3, 2, 1};

inserter操作

第1种描述: 返回在给定位置插入元素的迭代器; 添加元素后, it指向给定位置的下一位置

第2种描述: 传入指向元素的迭代器, 每次在该元素之前插入新元素

要求容器支持insert操作

顺序容器 是否支持
vector(string) O
deque O
list O
forward_list X
1it = inserter(c, iter);
2
3*it = val;
4
5// <=>
6// it = c.insert(it, val);
7// ++it;

多次使用it插入元素,it所指元素不变,总是在该元素之前插入元素


示例

1list<int> lst = {1, 2, 3, 4};
2list<int> lst3;
3
4copy(lst,cbegin(), lst.cend(), inserter(lst3, lst3.begin());
5
6// lst3为空,lst.begin() == lst.end() == 尾后迭代器
7// lst3 = {1, 2, 3, 4};

对插入迭代器执行解引用操作的好处

  1. 与其他迭代器的使用保持一致
  2. 可以增加代码可读性
 1vector<string> words = {"hello", "world", "!!!"};
 2
 3auto it = words.begin() + 1;    // world
 4
 5auto iter = inserter(words, it);
 6
 7*iter = "my";    // words = {"hello", "my", "world", "!!!"}。在world之前插入元素
 8
 9*iter = "work";    // words = {"hello", "my", "work", "world", "!!!"}。在world之前插入元素
10
11cout << *it << endl;        // world
12
13cout << *iter << endl;        // 错误:*iter返回iter,无法输出迭代器