• C++杂谈(二)初识vector容器与迭代器


    教科书中失踪的vector

    很奇怪的一件事情,在当时学习C++的时候,老师并没有讲授容器的内容,当时参考的谭浩强老师的红皮C++也没有这个内容,不知为何。后来再学C++,发现容器是一个很重要的概念,在C++primer中,大量使用了vector容器,在很多在线编程网站的题目中,也使用了vector<int>取代了整形数组。同样的,教材中也没有出现迭代器。

    vector比数组好在哪?

    vector和数组都是存储相同类型对象的容器。vector的大小变,数组大小固定不变,所以vector更加灵活。在不确定元素个数的时候,vector更适合。当元素个数确定时,可以使用数组。对于某些情况下,数组的性能可能更好一些。

    使用vector

    vector是标准库类型,需要包含适当的头文件。

    #include<vector>
    using std::vetor;

    vector是类模板而非类型,必须实例化。

    vector<int>

    初始化vector

    vector<T> v1;//空vector
    vector<T> v1(v2);//v1是v2副本
    vector<T> v2=v1;//与上等价
    vector<T> v3(n,val);//n个元素,都是val
    vector<T> v4(n);//n个元素,执行值初始化
    vector<T> v5{a,b,c,.....}//列表初始化
    vector<T> v5={a,b,c,...}//遇上等价

    对vector操作

    大多vector操作和string很相似

    v.push_back(t);//追加元素到尾端
    
    v.size();//返回元素个数
    
    v.empty();//返回是否是空
    
    v[n];//下标访问
    
    //以及 ==,!=,>,>=,<,<=

    注意:

    1. 不能用下标添加元素
    2. 只能对已存在的元素进行下标操作,否则会导致缓冲区溢出(buffer overflow,用下标访问不存在的元素)

    使用迭代器

    迭代器iterator的作用类似于指针,对对象间接访问。获取迭代器使用begin()与end(),注意,end返回容器尾部的下一位置。

    获得迭代器与迭代器类型

    auto b=v.begin();//auto是c++11的新类型说明符
    vector<int>::iterator it1;//it是读写的迭代器,每个容器定义了一个迭代器
    vector<int>::const_iterator it2;//it2只能读,不能写

    迭代器运算

    *it;//返回引用
    it->mem//等价(*it).mem
    //也有++,--,==,!=;
    //有+n,-n,+=,-=;
    it1-it2;//返回类型difference_type
    //有>,<,>=,<=

    迭代器的作用于指针类似,操作也类型于指针。

    一个使用vctor与迭代器的二分搜索

    vector<int>::const_iterator binarySearch(vector<int> &arr, int target)
    {
        vector<int>::const_iterator begin = arr.begin();
        vector<int>::const_iterator end = arr.end();
        vector<int>::const_iterator mid = begin + (end - begin) / 2;
        while (mid != end&&*mid != target)
        {
            if (target < *mid)
                end = mid;
            else
                begin = mid + 1;
            mid = begin + (end - begin) / 2;
        }
        return mid;
    }

    ps.看到有一种说法,迭代器是一种广义指针,也是有其道理的。

  • 相关阅读:
    如何实现一个教师与学生教学辅助平台?
    面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?请根据自己的理解简明扼要的回答。
    2..移动APP开发使用什么样的原型设计工具比较合适?
    new delete和malloc free的区别
    char * 和char[]的区别以及怎样与string类型进行转换
    浅谈const的基本用法
    c++ map按key或value的值分别进行排序
    二叉树及先序,中序,后序遍历
    c++发展趋势
    markdown 的基本操作
  • 原文地址:https://www.cnblogs.com/yatesxu/p/5436414.html
Copyright © 2020-2023  润新知