迭代器适配器: 插入迭代器
2023年12月24日 2023年12月25日
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};
对插入迭代器执行解引用操作的好处
- 与其他迭代器的使用保持一致
- 可以增加代码可读性
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,无法输出迭代器