• 再谈迭代器


    一、插入迭代器

     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 }
  • 相关阅读:
    LInux 解压缩文件
    关于启明星系统移除apppath配置,让系统自动获取路径来设置cookie的解决方法
    Repository 设计模式介绍
    启明星桌面天气系统和抽奖系统源代码
    关于web.config增加禁止匿名访问而导致pdf失效的问题
    C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher (WMI)
    如何在windows2008/2012上安装启明星系统。
    连接MSSQL2008 Express
    启明星系统加密方法代码
    MSSQL2008 全文索引的创建
  • 原文地址:https://www.cnblogs.com/dongsheng/p/3321584.html
Copyright © 2020-2023  润新知