[[C++ primer学习笔记]] 3.3 标准库类型vector

标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。

不包含引用的vector

3.3.1 定义和初始化vector对象

初始化vector对象的方法
vector<T> v1
v1是一个空vector,它潜在的元素是T类型,默认初始化默认初始化
vector<T> v2(v1)v2中包含v1所有元素的副本直接初始化
vector<T> v2=v1等价于v2(v1),v2中包含v1所有元素的副本拷贝初始化
vector<T> v3(n,val)v3包含n个重复的元素,每个元素的值都是val直接初始化
vector<T> v4(n)v4包含了n个重复地执行了值初始化的对象直接初始化
vector<T> v5{a,b,c,...}v5包含了初始值个数的元素,每个元素被赋予相应的初始值列表初始化{}
vector <T> v5={a,b,c,...}等价于v5{a,b,c,...}列表初始化{}
  • 最常用的方式:定义一个空vector,然后当运行时获取到元素的值后再逐一添加
  • 允许把一个vector对象的元素拷贝给另外一个vector对象,新vector对象的元素是原vector对象对应元素的副本,!!!两个vector对象的类型必须相同:

        vector <int> ivec;   ✔//初始状态是空

        vector<int> ivec2(ivec); ✔ //把ivec的元素拷贝给ivec2

        vector<int> ivec3=ivec;  ✔ //把ivec的元素拷贝给ivec3

        vector<string> svec(ivec2);  ×//错误:svec的元素是string对象,不是int

  • 列表初始化vector对象:初始元素值的列表只能把初始值放在花括号里进行初始化,而不能放在圆括号里

        vector<string> v1{"a","an","the"};✔

        vector<string> v2("a","an","the");×

  • 创建指定数量的元素:用vector对象容纳的元素数量和所有元素的统一初始值来初始化vector对象:

        vector <int> ivec(10,-1);//10个int类型的元素,每个都初始化为-1

        vector <string> svec(10,"hi"); //10个string类型的元素,每个都初始化为“hi”

  • 值初始化:只提供vector对象容纳的元素数量而略去初始值。库会根据vector对象中元素的类型决定一个值初始化元素初值。

        vector<int> ivec(10);  //10个元素,每个都初始化为0

        vector<string> svec(10); //10个元素,每个都是空string对象

        vector<int> vi=10; ×//错误:必须使用直接初始化的形式指定向量的大小

  • 列表初始值还是元素数量?

        vector<int> v1(10);  //v1有10个元素,每个的值都是0

        vector<int> v2{10};  //v2有1个元素,该元素的值是10

        vector<int> v3(10,1);  //v3有10个元素,每个的值都是1

        vector<int> v4{10,1};  //v4有2个元素,值分别是10和1

        vector <string> v5{"hi"}; //初始化列表:v5有一个元素

        vector<string> v6("hi");  //× ,错误:不能使用字符串字面值构建vector对象

        vector<string> v7{10};  //v7有10个默认初始化的元素

        vector<string> v8{10,"hi"}; //v8有10个值为“hi”的元素

(1)圆括号:可用来构造vector对象,如v1的初始值说明了vector对象的容量;v3的两个初始值分别说吗vector对象的容量和元素的初值。

(2)花括号:一般把花括号的值当成元素初始值的列表,如v2、 v4、v5,想要列表初始化vector对象,花括号里的值必须与元素类型相同。当花括号内提供的值不能用来列表初始化时,则该值用来构造vector对象。如v7和v8。

3.3.2向vector对象中添加元素

  • 直接初始化适用于三种情况:

        (1)初始值已知且数量较少

        (2)初始值是另一个vector的副本

        (3)所有元素的初始值都一样   

  • 问题:

        (1)创建vector对象时并不清楚实际所需的元素个数,元素的值也经常无法确定;

        (2)即使元素初值已知,但如果这些值总量较大而各不相同,那么在创建vector对象的时候执行初始化操作过于繁琐。

  • 解决方法:

        (1)先创建一个空vector

          (2) 在运行时利用vector的成员函数push_back向其中添加元素 .[push_back:负责把一个值当成vector对象的尾元素“压到push”vector对象的“尾端back” ]

            eg1: 元素初值已知,但如果这些值总量较大而各不相同

                        vector<int> v2;        //空 vector对象

                        for(int i=0;i!=100;i++)

                            v2.push_back(i);         //依次把整数值放到v2尾端

            eg2:直到运行时才知道vector对象中元素的确切个数。有时需要实时读入数据然后将其赋值vector对象

                   //从标准输入中读取单词,将其作为vector对象的元素存储

                    string word;

                    vector(string) text;  //空vector对象

                    while(cin>>word){

                                text.push_back(word);  //把word添加到text后面

                    }

3.3.3 其他vector操作

v.empty()如果v不含有任何元素,返回真,否则返回假
v.size()返回v中元素的个数
v[n]返回v中第n个位置上元素的引用
v1=v2用v2中元素的拷贝替换v1中的元素
v1={a,b,c,...}用列表中元素的拷贝替换v1中的元素
v1==v2v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同
v1!=v2 
<,<=,>,>=以字典顺序比较
  • 访问vector对象中元素的方法:通过元素在vector对象中的位置
  • 要使用size_type,需要首先指定它是由哪种类型定义的。vector对象的类型总是包含着元素的类型。
  • 计算vector内对象的索引:vector对象的下标从0开始,下标的类型是相应的size_type类型。只要vector对象不是一个常量,就能向下标运算符返回的元素赋值。
  • 不能用下标形式添加元素。vector对象的下标运算符可用于访问已存在的元素,而不能用于添加元素。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值