一、插入迭代器

 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, "\n");
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, "\n");
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 }

 

posted on 2013-09-15 18:13  可笑痴狂  阅读(400)  评论(0编辑  收藏  举报