C++标准库vector的使用

47 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

C++标准库vector.png

vector表示对象的集合,其中所有对象的类型都是相同的。每个对象都有索引,通过索引访问对象

 include <vector> //包含vector头文件
 ​
 using std::vector; //使用std命名空间
 ​

使用类模版指定vector对象的类型

  • vector能容纳绝大多数类型的对象作为其元素
  • 引用不是对象,所以不可以存引用
  • 大多数内置类型和类类型都可以存储

初始化vector对象

 vector<T> v1; //v1是空vector,存放的元素类型为T,执行默认初始化
 ​
 vector<T> v2(v1); //v2包含所有v1元素的副本
 vector<T> v2 = v1; //和上述等价
 ​
 vector<T> v3(n,val); //v3包含n个重复的val元素
 ​
 vector<T> v4(n); //v4包含n个执行了值初始化的对象,每个值的初始值由T的类型决定
 ​
 vector<T> v5{a,b,c,...}; //v5包含了多个有初始值的元素
 vector<T> v5 = {a,b,c,...}; //和上述等价

使用圆括号和花括号区分初始值的真正含义

  1. 使用的是圆括号,提供的值是用来构造vector对象
  2. 使用的是花括号,就是用列表初始化vector对象

但是如果使用了花括号,但是初始值又和vector包含的类型不匹配,那就可能是在使用圆括号的规则

 vector<string> v6{10}; //v6有10个默认初始化的元素
 ​
 vector<string> v7{10,"hi"}; //v7有10个值为"hi"的元素
 ​
 //但是尽量避免这样用吧,造成代码理解困难
 ​

初始化方式区别延伸

  • 除了string中介绍的直接初始化和拷贝初始化的区别
  • 如果提供的是初始元素列表,就只能把初始值放在花括号里进行初始化,如上述v5的初始化

vector操作方法

vector操作方法.png

  • 添加元素

    一般比较常用的初始化方法是默认空数据初始化,之后动态的向vector中添加元素

    使用push_back()函数,向vector尾部添加元素

     vector<int> v2;
     for (int i = 0; i < 100; ++i) {
       //添加元素
       v2.push_back(i);
     }
    

    注意:

    1. 如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环
    2. 范围for语句体内不应改变其所遍历序列的大小
  • 访问元素的方式和string访问字符方法类似,都是通过下标索引到对象

    • vector的索引下标是从0到size() -1
    • 不能通过下标的形式添加元素,这是错误的

       vector<int> ivec; //空vector
       ivec[0] = 1; //错误,ivec不包含任何元素,不存在index=0的元素
      
    • 如果访问的下标超过了vector的范围,会产生无法预期的问题

      因此如果确认下标合法,就可以使用for或者下标访问 如果不确定,应该使用迭代器访问

  • emptysize

    • 也是和string同名函数功能相同
    • size()返回的类型是vector<T>::size_type,必须包含着元素类型
  • 相等性性判断也和string功能一致

    但是需要比较时,那么vector中的元素必须有可以做比较的函数,不然不能比较两个vector