c++primer学习笔记-----3.3标准库类型vector

来源:互联网 发布:宁夏干部网络培训学校 编辑:程序博客网 时间:2024/05/17 09:04

标准库类型vector 表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引(下标),索引用于访问对象。它又被称为容器,第二部分将对容器进行更为详细的介绍。要想使用vector,需要头文件<vector> 和using std::vector 声明。

c++ 语言即有类模板,也有函数模板,vector 即是一个类模板。模板本身不是类或函数,相反可以看作为了编译器生成类或函数编写的说明规范。编译器根据模板创建类或函数的过程称为实例化,实例化时需要给出所需的必要信息。

对于类模板来说,我们通过提供一些额外信息来指定模板到底实例化成什么样的类,需要提供什么样的信息是由类模板决定的。

提供信息的方式总是这样:即在模板名字后面跟一对尖括号,在括号内放上信息。对于vector,需要用尖括号内给出vector 对象内存放元素的变量类型。

引用不是对象,不存在包含引用的vector。


3.3.1 定义和初始化vector 对象


【下面列出定义vector 对象的各种方法:

vector<T> v1; // v1 是一个空vector,它潜在的元素是T 类型的,执行默认初始化vector<T> v2(v1); // v2 是v1 的一个拷贝副本,但注意v1 和v2 的元素类型必须一致vector<T> v2 = v1; // 等价于上条语句vector<T> v3(n, val); // v3 包含了n 个重复的元素,每个元素的值都是valvector<T> v4(n); // v4包含了n个重复地执行了默认初始化的T 类型对象,当然前提是T 类型支持默认初始化vector<T> v5{a,b,c,...}; // v5 包含了初始值个数的元素,每个元素被赋予了对应列表的初始值vector<T> v5 = {a,b,c,...}; // 等价于上一条语句

列表初始化是c++ 11新标准中才得到全面应用的,在VS2012 中的很多场合,还不支持列表初始化。


空vector 看起来没什么用,但由于程序在运行时可以很高效地往vector 对象中添加元素,所以建立一个空vector 再逐个向内添加元素成了最常见的方式。


【使用花括号的列表初始化与使用圆括号的(元素数量,初始值)的批量初始化要注意区分。

事实上,当使用了花括号的形式,而括号内的值又不能用来列表初始化,编译器会尝试用这些值来进行批量初始化。】


3.3.2 向vector 对象中添加元素


【最常见的情况是,创建一个vector 对象是不清楚实际所需的元素个数;还有时候虽然清楚元素个数和值,但是值总量很大且各不相同,这些情况下执行上节所述的各种初始化方式就会显得过于繁琐。

通常我们会考虑先创建一个类型确定的空vector 对象,在运行时使用vector 类的成员函数push_back 向其中添加元素,push_back 函数接收vector 对象元素类型的参数,并负责把该参数当成vector 对象的尾元素“ 压到(push)”vector 对象的“尾端(back)”

string word;vector<string> text;while(cin >> word)text.push_back(word);


【c++ 标准要求vector 应在运行时高效快速地添加元素,因此既然vector 对象能高效地增长,在定义vector 对象的时候设定其长度就没什么必要了。

9.4 节将介绍vector 提供的其他方法,允许我们进一步提升动态添加元素的性能。


【范围for 语句体内不应改变其所遍历序列的大小:

如果循环体内部包含有向vector 对象添加元素的语句,则不能使用范围for 循环,原因将在5.4.3 节介绍


3.3.3 其他vector 操作


【vector 支持的操作(未加特别说明的操作与string 类型相同):
v.empty();v.size(); // 返回值是vector<T>::size_type,不同元素类型的vector 的size 函数返回值类型不同v.push_back(t);v[n]v1 = v2;v1 = {a, b, c,...};v1 == v2v1 != v2<, <=, >, >= // 比较规则与string 类型相同,但有个前提为元素类型必须为支持进行比较的类型

【与string 不同的另一点是,vector 不能用下标形式添加元素。
string 对象可以在串的末尾后使用下标形式添加元素(只是在内存上添加了元素,从串的角度上看并未改变)。】
0 0
原创粉丝点击