Loading

3-3 C++ vector类型

3.3.0 模板(Template)

vector说明

  • vector是含有相同类型的对象的集合(a collection of objects which have the same type)
  • 引用(reference)不是对象,所以无法建立引用的vector
  • vector本身不是类,而是一个类模板

模板简介

  • 分类:类(class)模板、函数模板

  • 类(class)模板本身不是类,但它给出了创建类(class)的一种方式,只要给定额外信息(addtional information),就能创建出对应的类(class),额外信息用尖括号括住。函数模板同理。

  • 编译器用模板来创建类或者函数的过程称为实例化(instantiation)

  • 对于vector来说,额外信息就是vector内存储的对象的类型(type)

    vector<int> v1; //给vecotr模板指定要存储的对象类型int,生成vector<int>类,v1是类vector<int>的对象
    vector<string> v2; //给vecotr模板指定要存储的对象类型string,生成vector<string>类,v2是类vector<string>的对象
    

3.3.1 vector的定义和初始化

初始化的方式

  • 默认初始化vector<int> v1

    不做任何关于初始化的说明,调用默认构造函数。v1是一个空集合

  • 值初始化vector<int> v2(10)

    说明了v2的初始化大小为10,但没有指定这10个元素的值,默认为0

  • 直接初始化和拷贝初始化:分类依据是形式,底层关系暂不讨论

    • 直接初始化:直接调用构造函数。无等号=

      vector<int> v3(10,3); //v3有10个元素,且每个元素的值都为3
      //v2其实也算直接初始化,因为初始化时直接调用了构造函数,无等号
      vector<int> v4(v3);  //将v3的值拷贝给v4
      
    • 拷贝初始化:将一个对象的拷贝给另一个对象。有等号=

      vector<int> v4 = v3;  //将v3的值拷贝给v4
      
  • 列表初始化:用{}直接列出元素

    vector<int> v5 = {1,2,3,4,5}; //v5有5个元素,分别为1,2,3,4,5【同时也是拷贝初始化】
    vector<int> v6{1,2,3,4,5};  //同上
    

注:上面几种分类方式是在不同维度上对初始化进行分类,会有交叉,如v5既是列表初始化又是拷贝初始化

说明,列表初始化时,如果内部的类型与vector存储对象的类型不同,编译器会继续把{}当成()处理,所以vector<string> v7{10}表示“v7含有10个字符,每个字符为空”,等价于vector<string> v7(10)【值初始化,直接初始化】。vector<string> v8{10,"hi"}等价于vctor<string> v8(10,"hi)

几个可供参考的博客

  1. 谈谈C++中各种初始化方式
  2. C++四种初始化方式
  3. C++的各种初始化方式

总结初始化

vector<int> v1;             //初始化为空

vector<int> v2 = v1;
vector<int> v2(v1);         //初始值等于另一个vector

vector<int> v3(10);         //指定大小但不指定值
vector<int> v4(10,2);       //指定大小且指定值

vector<int> v5{10,2,3}; 
vector<int> v5 = {10,2,3};  //直接给定元素

辨析

image-20220113133323924

答案

image-20220113133629426

3.3.2 往vector中添加元素

  • v.push_back(element)

    vector<int> v1;
    v1.push_back(1); //往v1中添加1
    int i = 2;
    v1.push_back(i); //往v1中添加i
    
  • 在范围for内部不能push_back()

3.3.3 vector的其他操作

  • 删除v1.pop_back()

  • vector支持下标操作与随机查找

  • 改 查 比较

    image-20220113134913245

  • 关于下标操作:超过v.size()-1的下标操作都是未定义的。不能用下标操作插入元素。

posted @ 2022-01-15 09:05  咪啪魔女  阅读(52)  评论(0编辑  收藏  举报