• 插入迭代器在标准算法中的作用及使用方法


    前言

      请问:算法能不能做一些改变容器基本大小的操作?要知道使用标准迭代器不会改变容器的大小,那么怎样让算法去做一些诸如往容器中插入元素的操作呢?答案很简单,使用“ 不标准 ”的迭代器呗!本文将介绍一种“ 非标准 ”迭代器 --- 插入迭代器,使用它和相关的标准算法就可以灵活的往容器中插入数据。

    问题提出

      使用标准算法往任意顺序容器中插入一组元素。

    错误示例

    下面代码意图往一个顺序容器中插入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算法等。

  • 相关阅读:
    大道至简伪代码形式读后感
    大道至简读后感
    使用类型转换生成六位验证字符,实现用户输入验证码的功能
    flex弹性布局的基本介绍
    清除浮动的方法以及为什么清除浮动
    :target伪类制作tab选项卡
    div中的内容水平垂直居中
    setTimeout和setInterval的区别以及如何写出效率高的倒计时
    margintop影响父元素定位
    关于页面中弹窗的定位问题
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3226426.html
Copyright © 2020-2023  润新知