一、插入迭代器
1 /** 2 解释三种插入迭代器的区别。 3 区别在于插入的元素的位置不同: 4 back_inserter,使用push_back实现在容器末端插入。 5 front_inserter, 使用push_front实现在容器前端插入。 6 inserter,使用insert实现插入,它还带有第二个实参:指向插入起始位置的迭代器 7 */ 8 9 #include <iostream> 10 #include <vector> 11 #include <list> 12 #include <iterator> 13 14 using namespace std; 15 16 int main() 17 { 18 vector<int> vec; 19 for(vector<int>::size_type cnt = 0; cnt != 5; ++cnt) 20 vec.push_back(cnt); 21 list<int> li; 22 replace_copy(vec.begin(), vec.end(), back_inserter(li), 0, 100); 23 for(list<int>::iterator itor = li.begin(); itor != li.end(); ++itor) 24 cout << *itor << " "; 25 cout << endl; //打印:100 1 2 3 4 26 li.erase(li.begin(), li.end()); 27 28 replace_copy(vec.begin(), vec.end(), front_inserter(li), 0, 100); 29 for(list<int>::iterator itor = li.begin(); itor != li.end(); ++itor) 30 cout << *itor << " "; 31 cout << endl; //打印:4 3 2 1 100---front_inserter对于每个插入元素都插入到当前的首部 32 li.erase(li.begin(), li.end());//因此会导致元素以相反的次序出现在目标容器中 33 34 list<int>::iterator itor = find(li.begin(), li.end(), 0); 35 replace_copy(vec.begin(), vec.end(), inserter(li, itor), 0, 100); 36 for(list<int>::iterator itor = li.begin(); itor != li.end(); ++itor) 37 cout << *itor << " "; 38 cout << endl; //打印:100 1 2 3 4----inserter每次都在itor指的那个位置处插入 39 li.erase(li.begin(), li.end()); 40 system("pause"); 41 return 0; 42 }
二、iostream迭代器
1 /** 2 * 功能:读 cin,直到到达文件结束或者输入的不是 int 型的数值为止(其中输入字符也结束), 3 * 读取的元素将用来构造vec对象 4 */ 5 #include <iostream> 6 #include <vector> 7 #include <iterator> 8 9 using namespace std; 10 11 int main() 12 { 13 istream_iterator<int> in_itor(cin); 14 istream_iterator<int> eof; // eof 迭代器定义为空的istream_iterator对象,用作结束迭代器, 15 //绑定在流上的迭代器在遇到文件结束或某个错误时,将等于结束迭代器的值 16 17 /* 18 //法一: 19 vector<int> vec; 20 while(in_itor != eof) 21 vec.push_back(*in_itor++); 22 */ 23 vector<int> vec(in_itor, eof);//法二: 24 25 for(vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) 26 cout << *it << " "; 27 cout << endl; 28 system("pause"); 29 return 0; 30 }
1 /** 2 * 3 */ 4 #include <iostream> 5 #include <vector> 6 #include <iterator> 7 8 using namespace std; 9 10 int main() 11 { 12 istream_iterator<string> in_itor(cin), eof; 13 //eof 迭代器定义为空的istream_iterator对象,用作结束迭代器, 14 //绑定在流上的迭代器在遇到文件结束或某个错误时,将等于结束迭代器的值 15 16 //ostream_iterator<string> out_itor(cout, " "); 17 ostream_iterator<string> out_itor(cout); 18 //用于将string类型的对象写到cout中,每个string对象后跟一个换行符 19 20 while(in_itor != eof) 21 { 22 *out_itor++ = *in_itor++; 23 } 24 25 system("pause"); 26 return 0; 27 }
1 /** 2 *功能:从标准输入读取一些数,再将读取的不重复的数写到标准输出 3 */ 4 #include <iostream> 5 #include <vector> 6 #include <iterator> 7 8 using namespace std; 9 10 int main() 11 { 12 istream_iterator<int> in_itor(cin), eof; 13 vector<int> vec(in_itor, eof); 14 sort(vec.begin(), vec.end()); //注意unique只能去除相邻的重复元素,所以要先排序是相同元素排在一起 15 ostream_iterator<int> out_itor(cout, " ");//每个输出后跟一个空格 16 17 unique_copy(vec.begin(), vec.end(), out_itor); 18 19 system("pause"); 20 return 0; 21 }
1 /** 2 * 功能:使用copy算法将一个文件的内容写到标准输出中。 3 */ 4 5 #include <iostream> 6 #include <algorithm> 7 #include <iterator> 8 #include <fstream> 9 10 using namespace std; 11 12 int main() 13 { 14 string filename; 15 cout << "Enter input file name:" << endl; 16 cin >> filename; 17 ifstream inFile(filename.c_str());//只能用 c 风格的字符串 18 if(!inFile) 19 { 20 cout << "Can not open file:" << filename << endl; 21 return EXIT_FAILURE; 22 } 23 24 ostream_iterator<string> outItor(cout, " "); //以空格分隔数据 25 istream_iterator<string> inItor(inFile), eof; 26 copy(inItor, eof, outItor); 27 28 inFile.close();//关闭文件 29 30 system("pause"); 31 return 0; 32 }
1 /** 2 * 功能:编程使用istream_iterator对象从标准输入读入一些列整数。使用ostream_iterator对象 3 *将其中的奇数写到一个文件中,并在每个写入值后加一个空格,同样将偶数写到另一个文件, 4 *每个写入的值都存放在单独的行中。 5 */ 6 7 #include <iostream> 8 #include <algorithm> 9 #include <iterator> 10 #include <fstream> 11 12 using namespace std; 13 14 int main() 15 { 16 string oddfile, evenfile;//写入的文件名如果不存在会自己建立 17 cout << "请输入写入奇数的文件名:" << endl; 18 cin >> oddfile; 19 cout << "请输入写入奇偶数的文件名:" << endl; 20 cin >> evenfile; 21 ofstream oddFile(oddfile.c_str());//只能用 c 风格的字符串 22 ofstream evenFile(evenfile.c_str());//只能用 c 风格的字符串 23 if(!oddFile) 24 { 25 cout << "Can not open file:" << oddfile << endl; 26 return EXIT_FAILURE; 27 } 28 if(!evenFile) 29 { 30 cout << "Can not open file:" << evenfile << endl; 31 return EXIT_FAILURE; 32 } 33 cout << "输入一些整数,ctrl+z结束输入" << endl; 34 istream_iterator<int> inItor(cin), eof; 35 ostream_iterator<int> outOddItor(oddFile, " "); 36 ostream_iterator<int> outEvenItor(evenFile, " "); 37 while(inItor != eof) 38 { 39 if(*inItor & 1) 40 *outOddItor++ = *inItor++; 41 else 42 *outEvenItor++ = *inItor++; 43 } 44 oddFile.close();//关闭文件 45 evenFile.close(); 46 47 system("pause"); 48 return 0; 49 }
三、反向迭代器
1 #include <iostream> 2 #include <iterator> 3 #include <algorithm> 4 #include <vector> 5 6 using namespace std; 7 8 int main() 9 { 10 int ia[] = {0,1,2,3,4,5,6,7,8,9}; 11 vector<int> ivec(ia, ia+10); 12 13 //逆序输出ivec容器中的元素 14 sort(ivec.rbegin(), ivec.rend());//从大到小排列 15 for(vector<int>::reverse_iterator r_itor = ivec.rbegin(); r_itor != ivec.rend(); ++ r_itor) 16 cout << *r_itor << " "; 17 cout << endl; 18 /* 19 //普通迭代器做法 20 for(vector<int>::iterator itor = ivec.end()-1; itor >= ivec.begin(); --itor) 21 cout << *itor << " "; 22 cout << endl; 23 */ 24 system("pause"); 25 return 0; 26 }
1 #include <iostream> 2 #include <iterator> 3 #include <algorithm> 4 #include <vector> 5 #include <list> 6 using namespace std; 7 8 int main() 9 { 10 int ia[] = {0,1,2,3,4,5,6,7,8,0,9}; 11 list<int> li(ia, ia+sizeof(ia)/sizeof(ia[0])); 12 list<int>::reverse_iterator r_itor = find(li.rbegin(), li.rend(), 0); 13 if(r_itor != li.rend()) 14 { 15 cout << "element after the last 0 : " << *(--r_itor) << endl; 16 } 17 else 18 cout << "no element 0" << endl; 19 system("pause"); 20 return 0; 21 }
1 /** 2 * 假设有一个名为line的string对象,存储以逗号分隔的单词列表,输入第一个单词和最后一个单词 3 * 所有反向迭代器都提供成员函数 base转换 4 * 注意:rbegin()与end() 不同 r_comma与r_comma.base() 也不同 5 */ 6 #include <iostream> 7 #include <iterator> 8 #include <algorithm> 9 #include <string> 10 11 using namespace std; 12 13 int main() 14 { 15 string line("one,two,three"); 16 string::iterator comma = find(line.begin(), line.end(), ','); 17 18 cout << "第一个单词为:"; 19 /* 20 for(string::iterator itor= line.begin(); itor != comma; ++itor) 21 cout << *itor; 22 */ 23 cout << string(line.begin(), comma) << endl; // 输出:one 24 25 string::reverse_iterator r_comma = find(line.rbegin(), line.rend(), ','); 26 /* 27 for(string::reverse_iterator itor= line.rbegin(); itor != r_comma; ++itor) 28 cout << *itor; 29 cout << endl; 30 */ 31 cout << string(line.rbegin(), r_comma) << endl; // 输出:eerht (并非three) 32 33 cout << string(r_comma.base(), line.end()) << endl;// 输出:three 34 35 system("pause"); 36 return 0; 37 }