zoukankan      html  css  js  c++  java
  • vector详讲(二)迭代器

    先看一下代码:

    #include <iostream>
    #include <vector>
    
    int main()
    {
        std::vector<double> doubleVector;
        for(size_t i = 0;true;++i)
        {
            double temp;
            std::cin >> temp;
            if(temp == -1)
            {
                break;
            }
            doubleVector.push_back(temp);
        }
    
        for(std::vector<double>::iterator iter = std::begin(doubleVector);
                iter != std::end(doubleVector);++iter)
        {
            std::cout << *iter << " ";
        }
    
        return 0;
    }
    std::vector<double>::iterator iter = std::begin(doubleVector)

    每一个容器都定义了一个名为 iterator 的类型,来表示这个容器的迭代器,其中std::begin()返回的是容器中第一个元素的迭代器

    iter != std::end(doubleVector)

    这条语句是检查是否超过了这个容器的尾部序列(也就是检查是否越界);

    ++iter

    我们要养成一个好习惯,那就是采用前置递增,而不是后置递增,因为前置递增返回的是iter的引用,而后置递增iter++,返回的是一个新的迭代器对象,这个效率会低下;

    但是我们也可以这样简化代码的书写

    #include <iostream>
    #include <vector>
    
    int main()
    {
        std::vector<double> doubleVector;
        for(size_t i = 0;true;++i)
        {
            double temp;
            std::cin >> temp;
            if(temp == -1)
            {
                break;
            }
            doubleVector.push_back(temp);
        }
    
        for(auto iter = std::begin(doubleVector);iter != std::end(doubleVector);++iter)
        {
            std::cout << *iter << " ";
        }
    
        return 0;
    }

    编译器会根据右侧内容来推测iter的类型;

    访问对象元素的字段:

    #include <iostream>
    #include <vector>
    
    int main()
    {
       std::vector<std::string> stringVector(3,"Hello ");
        for(auto  iter = std::begin(stringVector);iter != std::end(stringVector);++iter)
        {
            iter->append("world ");
        }
        for(auto iter = std::begin(stringVector);iter != std::end(stringVector);++iter)
        {
            std::cout << *iter << std::endl;
        }
    
        return 0;
    }

    还可以这样:

    #include <iostream>
    #include <vector>
    
    int main()
    {
       std::vector<std::string> stringVector(3,"Hello ");
        for(auto  & iter : stringVector)
        {
            iter.append("world ");
        }
        for(auto  & iter : stringVector)
        {
            std::cout << iter << std::endl;
        }
    
        return 0;
    }

    两则是相同的!

    const_iterator

    普通的iterator支持读和写,但是当对const对象调用std::begin()和std::end()的话,将会得到const_iterator,所以const_iterator只支持读操作,不支持写操作;

    interator可以转化为const_iterator但是,const_iterator不会转化为iterator。

    #include <iostream>
    #include <vector>
    
    int main()
    {
         const std::vector<double> myVector({21l,985,21.3,34.2});
    
        for(std::vector<double>::const_iterator iter = std::begin(myVector);
                iter != std::end(myVector);++iter)
        {
            std::cout << *iter << " ";
        }
        return 0;
    }

    其中可以将std::begin()和std::end()换成std::cbegin()和std::cend();  这里的c是const的意思;注意:这种操作只能在C++14上实践

    常用的函数:

    1. pop_back();删除最后的元素;

    2.insert(),有三种类型参数;

      第一种:insert(const_itertor pos,const T& x);

      第二种:insert(const_iterator pos,size_type n ,const T& x);在pos位置插上n个x;

      第三种:insert(const_iterator pos,inputfirstPos first, inputlastPos last);将范围first和last内的元素插入到pos

    3.eras()函数的两种形式:

      eras(const_itertor pos);

      eras(const_itertor pos , const_itertor lastPos);    //删除一个范围

    4.clear()  清除所有的数据

      

    #include <iostream>
    #include <vector>
    
    template<typename T>
    void printVector(std::vector<T> &tVector)
    {
        for(auto &iter : tVector)
        {
            std::cout << iter << " ";
        }
        std::cout << std::endl;
    }
    int main()
    {
        std::vector<int> oneVector({1,2,3,4,5});
        std::vector<int> twoVector;
        for(size_t i = 0;i < 5;++i)
        {
            twoVector.push_back(i+6);
        }
    
        std::cout << "oneVector :";
        printVector(oneVector);
        std::cout << "twoVector :";
        printVector(twoVector);
    
        oneVector.insert(std::end(oneVector),std::begin(twoVector),std::end(twoVector));
        std::cout << "oneVector :";
        printVector(oneVector);
    
        int tenp = 0;
        std::cin >> tenp;
        oneVector.insert(std::end(oneVector),tenp);
        std::cout << "oneVector :";
        printVector(oneVector);
    
        oneVector.erase(std::end(oneVector) - 1);       //注意这里要+1
        std::cout << "oneVector :";
        printVector(oneVector);
    
        twoVector.pop_back();
        std::cout << "twoVector :";
        printVector(twoVector);
    
        oneVector.clear();          // 清除所有数据
        std::cout << "oneVector :";
        printVector(oneVector);
    
        return 0;
    }

    结果是:

    oneVector :1 2 3 4 5
    twoVector :6 7 8 9 10
    oneVector :1 2 3 4 5 6 7 8 9 10
    11
    11
    oneVector :1 2 3 4 5 6 7 8 9 10 11
    oneVector :1 2 3 4 5 6 7 8 9 10
    twoVector :6 7 8 9
    oneVector :

     

  • 相关阅读:
    QuartusII13.0使用教程详解(一个完整的工程建立)
    基于Vivado调用ROM IP core设计DDS
    FPGA学习之路——一路走来
    基于basys2用verilog设计多功能数字钟(重写)
    基于basys2驱动LCDQC12864B的verilog设计图片显示
    PWM(脉宽调制)——LED特效呼吸灯设计
    Isim你不得不知道的技巧(整理)
    ISE、vivado、QuartusII调用notepad++、UE汇总(整理)
    java环境配置为1.7jdk为什么cmd java -version查看版本是1.8
    TCP/IP三次握手和HTTP过程
  • 原文地址:https://www.cnblogs.com/boost/p/10370528.html
Copyright © 2011-2022 走看看