前言
请问:算法能不能做一些改变容器基本大小的操作?要知道使用标准迭代器不会改变容器的大小,那么怎样让算法去做一些诸如往容器中插入元素的操作呢?答案很简单,使用“ 不标准 ”的迭代器呗!本文将介绍一种“ 非标准 ”迭代器 --- 插入迭代器,使用它和相关的标准算法就可以灵活的往容器中插入数据。
问题提出
使用标准算法往任意顺序容器中插入一组元素。
错误示例
下面代码意图往一个顺序容器中插入10个0:
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 int main() 8 { 9 vector<int> vec; 10 11 // 往vec中写入10个0 12 fill_n(vec.begin(), 10, 0); 13 14 /* 15 * 输出容器 16 */ 17 for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) 18 cout << *it << " "; 19 20 cout << endl; 21 22 return 0; 23 }
运行结果:
算法参数vec.begin()是一个标准的迭代器,使用它作为参数不可能改变容器的大小,故试图往容器中插入数据的操作肯定会失败。
正确示例
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 // 使用非标准的迭代器都要包含这个头文件 5 #include <iterator> 6 7 using namespace std; 8 9 int main() 10 { 11 vector<int> vec; 12 // 往vec中写入10个0,第一个参数是插入迭代器。 13 fill_n(back_inserter(vec), 10, 0); 14 15 /* 16 * 输出容器 17 */ 18 for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) 19 cout << *it << " "; 20 21 cout << endl; 22 23 return 0; 24 }
运行结果:
使用了插入迭代器,问题自然迎刃而解。
后记
除了本文示例中的fill_n算法外,其他算法只要涉及到往算法中插入元素,十有八九也得用到插入迭代器。比如copy算法等。