C++教程之vector

背景

一个vector是一系列的对象,其中的对象都是同一个类型,每一个对象都有一个索引,通过这个索引可以获取到这个对象,一个vector通常被认为是一个容器,因为它包含了其他对象,对于容器之后我们会详细介绍,为了使用vector我们需要引入相关的头文件,通过以下声明我们就可以直接使用vetcor了。

# include<vector>
using std::vector;

vector是一个类模版,C++同时拥有类模版和函数模版,写一个模版需要对C++有一个很深的理解,之后会有内容详细介绍C++模版的相关内容,所幸是我们不需要对模版很了解也可以使用它。模版不是类或者函数本身,相反,模版是被认为是编译器生成类和函数的指引,编译器从模版创建类和函数的过程被称为实例化,当我们使用模版时需要向编译器指定需要生成哪个类型的类或者函数,对于vector而言,我们需要提供的额外信息时vector所存储的对象的类型。

 vector<int> ivec; //vector包含int类型
 vector<vector<string>> file; //vector存储的事vector类型

vector是一个模版而不是类型,从vector产生类型必须要包含元素的类型。我们可以定义包含任意类型的vector,由于引用不是对象所以不能定义引用的vector。

需要注意的是在一些老版本的C++中对于vector的定义与现在有所不同,需要在尖括号内添加一个空格,如下所示,在一起编译器中需要这种老的声明方式。

vector<vector<int> > vecs;

定义与初始化

以下提供了关于vector的六种定义与初始化的方式

 vector<string> v1; // vector包含string类型对象,默认初始化,v1为空
 vector<string> v2(v1); //v2复制v1的所有内容
 vector<string> v3 = v1; //v3也是复制v1的所有内容
 vector<string> v4(4, "123"); // v4中有四个”123“
 vector<string> v5(10); //v5有10个初始化值的对象
 vector<string> v6{"12", "23"}; // 列表初始化,v6中有两个对象”12“, ”23“
 vector<string> v7 = {"21", "32"}; //列表初始化,v7中有两个对象”21“, "32"

需要注意的是列表初始化方式在C++99是不支持的,要C++11及以上才可以,否则会编译报错。

添加元素

直接初始化vector的所有元素在数据较少的情况下,或者想要拷贝其他vector,有或者想要初始化所有的元素为一个值时比较好用,更加常用的情况是当我们创建一个vector时并不知道需要多少元素,或者我们不知道需要的所有元素的值,即使知道所有元素的值,在创建vector时指定每一个值也是非常繁琐的。

一个简单的例子,当我们需要一个vector其值是从0到9,我们可以很容易使用列表初始化去初始化一个vector,但是如果我们需要0到99或者0到999的vector呢?其中一个比较好的方式是先创建一个空的vector,然后通过push_back在运行时添加元素,push_back操作可以将值放置到vector的末尾。例子如下:

vector<int> v2;
    for (int i = 0; i < 100; i++) {
        v2.push_back(i);
    }
}

除了push_back,vector还提供了其他的操作,其中绝大多数操作与string类型类似,具体内容如下:

操作 解释
v.empty() 判断vector是否为空
v.size() 获取vector的容量
v[n] 获取vetor的第n个元素
v1=v2 将v2的值复制给v1
v1 = {a, b, c} 将v1的值替换为{a, b, c}

和string类型类似,我们可以通过下标获取vector的元素,vector的下标也是从0开始,如果vector时非const,我们也可以通过下标获取元素然后修改它的值。与此同时我们可以计算一个下标然后直接获取该位置上的值。例如我们有一些分数,其值在0-100之间,我们想为这些分数划分区间,如0-8,10-19等等,想计算每一个区间内分数的数量。

vector<int> scores(11, 0);
    unsigned grade;
    while (std::cin >> grade) {
        ++scores[grade/10];
    }

需要注意的是下标只能获取已有元素而无法添加元素,所以无法通过空vector的下标为其添加元素。

猜你喜欢

转载自blog.csdn.net/QStack/article/details/128962208