#include <list> #include <fstream> #include <iostream> #include <fstream> #include <vector> #include <map> #include <algorithm> #include <string> using namespace std; int main() { vector<int>a; ifstream os("c:\\a.txt"); back_insert_iterator<vector<int> > it(a); copy(istream_iterator<int>(os), istream_iterator<int>(), it); copy(a.begin(), a.end(), ostream_iterator<int>(cout," ")); os.close(); return 0; }
SET:
#include <list> #include <fstream> #include <iostream> #include <fstream> #include <vector> #include <map> #include <algorithm> #include <string> #include <set> #include <queue> using namespace std; int main() { set<string>a; ifstream os("c:\\a.txt"); insert_iterator<set<string> > it(a,a.begin()); copy(istream_iterator<string>(os), istream_iterator<string>(), it); copy(a.begin(), a.end(), ostream_iterator<string>(cout," ")); os.close(); return 0; }
插入迭代器:
分为back_inserter,front_inserter,inserter;其中第一类为向后插入,第一种为向前插入,最后一种可以指定特定的位置(所谓位置其实由迭代器指定)进行插入;当然,如果你用最后一种指定位置为开头或者结尾,也实现了back_inserter和front_inserter的功能。当然,这都要求建立在理解各种容器的内部结构的基础上,比如vectors,如果用inserter于某个位置(不是end),那么由于其实际上为一个动态数组,在其中插入一个元素,后面必须移动,性能很差,deque为双向数组,也一样。而list,其实际上为一个双向链表,所以用inserter性能就不错。set,map内部结构实际上为二叉树,插入的位置其实没什么用,系统会为其找到合适的位置插入,所以性能也不错。下面看一个例子: #include<iostream> #include<list> #include<set> #include<algorithm> using namespace std; void print(int elem) { cout<<elem<<' '; } main() { list<int> col1; back_insert_iterator<list<int> > iter(col1); //注意,iter会自动++ *iter=1; *iter=2; *iter=3; for_each(col1.begin(),col1.end(),print); cout<<endl; //临时向后插入迭代器 back_inserter(col1)=22; back_inserter(col1)=33; for_each(col1.begin(),col1.end(),print); cout<<endl; //复制到向前插入迭代器 list<int> col2; copy(col1.begin(),col1.end(),front_inserter(col2)); for_each(col2.begin(),col2.end(),print); cout<<endl; //一般插入型迭代器 set<int> col3; insert_iterator<set<int> > iter_pos(col3,col3.begin()); *iter_pos=7; *iter_pos=11; *iter_pos=22; *iter_pos=10; *iter_pos=4; *iter_pos=100; *iter_pos=31; for_each(col3.begin(),col3.end(),print); cout<<endl; inserter(col3,col3.end())=56; inserter(col3,col3.end())=76; for_each(col3.begin(),col3.end(),print); cout<<endl; //复制到一般插入迭代器 //插到了col2的前面 copy(col3.begin(),col3.end(),inserter(col2,col2.begin())); for_each(col2.begin(),col2.end(),print); cout<<endl; //插到了col2第一个元素和第二个元素中间 copy(col3.begin(),col3.end(),inserter(col2,++col2.begin())); for_each(col2.begin(),col2.end(),print); cout<<endl; }