标准库类型vector
标准库类型vector表示对象的集合,其中所有对象类型都相同。vector因为“容纳”着对象,故也被称作容器。
要使用vector,必须包含头文件以及using声明:
#include<vector>
using std::vector;
vector是一个类模板,模板本身不是类或者函数,编译器根据模板创建类或者函数的过程称为实例化。当使用模板时,我们需要指出编译器应把类或函数实例化成何种类型。提供信息的方式总是这样:在模板名字后面跟一对尖括号,在括号内放上信息。
以vector为例:
vector<int> ivec; //ivec保存int类型的对象
vector<Sales_item> Sales_vec; //保存Sales_item类型的对象
vector<vector<string>> file; //该向量的元素是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个重复的执行了初始化的对象
vector<T> v5{a,b,c...}; //v5包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v5 = {a,b,c...}; //同上
**圆括号?方括号?**观察这两种括号初始化的不同含义
- 向vector对象中添加元素
常见的情况下,创建一个vector对象时并不清楚实际所需的元素个数,元素的值也经常无法确定。还有某些情况使得在创建vector对象的时候执行初始化操作会显得过于繁琐。
场景一:令vector对象包含0到99,这里可以使用到vector的成员函数push_back,其负责把一个值当vector对象的尾元素“压到”vector对象的末尾。
vector<int> v; //创建一个空vector对象
for(int i = 0;i < 100;i++)
v2.push_back(i); //利用循环依次把整数值放到v2尾端
场景二:到输入时才知道元素个数。从标准输入中读取单词,将其作为vector对象的元素储存。这里显然也可以使用函数push_back。
vector<string> text;
string word;
while(cin >> word){
text.push_back(word); //把word添加到text尾部
}
注意:如果循环体包含有向vector对象添加元素的语句,不能使用范围for循环。
- vector支持的常见
骚操作
v.empty() //如果容器v不含有元素,返回真,否则返回假
v.size() //返回v中元素的个数
v.push_back(elem) //往v的尾端添加元素elem
v.pop_back() //移除最后一个元素
v.begin() // 返回指向第一个元素的迭代器
v.end() //返回指向容器的“尾元素的下一位置”的迭代器,它指向一个不存在的尾后元素。
v.insert(pos,elem) // 在pos位置前插入一个元素elem,返回新数据位置。
v.insert(pos,n,elem) // 在pos位置前插入n个elem数据,无返回值。
v.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值。
v.erase(pos) // 删除pos位置的数据,返回下一个数据的位置。
v.erase(beg,end) //删除[beg,end)区间的数据,返回下一个数据的位置。
v.clear() // 移除容器中所有数据。
-
关于vector对象之间的比较
与string的规则一致 -
计算vector内对象的索引
使用下标运算符能获取到指定的元素(和string一样,也是从0开始计)。注意,不能用下标去添加元素:
for(decltype(ivec.size()) ix=0;ix != 10;++ix)
ivec[ix] = ix; //严重错误
正确方法是使用push_back。
只能对确知已存在的元素执行下标操作!
做题时多多注意在写循环时不要超出vector下标范围!