标准库类型——vector

标准库类型vector表示对象的集合

其中所有对象的类型都相同

集合中每个对象都有一个与之对应的索引

索引用于访问对象

因为vector“容纳”其它对象

所以也被称为一种容器

//这定义是不是越听越像数组?

//primer里这个出现的顺序可比数组早一节


vector的使用

需要先包含头文件#include<vector>

命名空间using std::vector;

C++有类模板也有函数模板

vector是函数模板的一种

根据模板创建类或函数的过程就被称为实例化

  • vector <int> number;//number保存了int类型的对象
  • vector<Sales_Item>Sales_vec;//保存了自定义的类型(Sales_Item)的对象
  • vector<vector<string>>file;//保存了以vector为元素的对象

初始化vector的方法

T指代类型

  • vector<T> v1    //空的vector,执行的是默认初始化(就是啥都没有)
  • vector<T> v2(v1)    //v2是v1的一个副本,注意v1必须和v2类型相同
  • vector<T>v2 = v1    //等价与v2(v1)

C11标准的初始化方法

  • vector<T>v3(n,val)    //v3包含了n个重复的元素,每个元素的值都是val
  • vector<T>v4(n)    //v4的元素个数为n,元素的默认值根据类型而变,例如int默认为0
  • vector<T>v5{a,b,c….}    //v5包含了初始值个数的元素,每个元素被赋予相应的初始值
  • vector<T>v5 = {a,b,c….}    //和上面等价

因为初始化的方法比较多,所以要注意圆括号和花括号来区分含义

  • 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中添加元素

对于vector对象来说,直接初始化的方式适用于三种情况:

  • 初始值已知且数量较少
  • 初始值是另一个vector对象的副本
  • 所有元素的初始值都一样

更常见的情况是你不知道有多少元素也不知道他们的值

当元素数量大的时候(99个甚至9999个的时候)列表初始化也不太行了

所以更好的处理方法先创建一个空的vector
然后利用vector的成员函数push_back向其中添加元素

vector<int>  v1;

for(int i=0; i != 100; i++)
        v2.push_back(i);

这段代码将整数值依次放到v2的尾端

最后结果是v2有一百个元素,值从0到99

对于string这种可能需要实时读入数据然后把值赋给对象的情况

可以如下操作

string word;

vector<string> text;

while(cin>>word){
text.push_back(word);

}//只要检测到word输入完毕后就把word添加到text的尾端


其它vector操作

v.empty()                   如果v不含有任何元素就返回真,否则返回假

v.size()                        返回v中元素的个数

v.push_back(t)         向v的尾端添加一个值为t的元素

v[n]                              返回v中第n个位置上元素的引用

v1 = v2                         用v2中的元素的拷贝去替换v1的元素

v1 = {a,b,c…}              用列表中的元素的拷贝替换v1的元素

v1 == v2                      v1和v2相等当且仅当他们的元素数量相同且对应位置的元素值相同

v1 != v2

<,<=,>,>=                 以字典顺序进行比较

访问vector对象中元素的方法和访问string对象中的字符的方法差不多

也是通过元素在vector的位置访问的

  • vector<int>v{1,2,3,4,5,6,7,8};
  • for(auto &i : v)
  • i*=i;
  • for(auto &i : v)
  • cout<<i<<” “;
  • cout<<endl;

第一个循环里的i是引用类型,这样就可以通过i给v的元素赋值

其中i的类型由auto关键字指定

第二个循环输出了所有元素

vector的empty和size功能和string完全一致

只有当元素的值可比较时,两个对象才能被比较


计算vector内对象的索引

vector的下标同样时从0开始

下标的类型是相应的size_type类型

但是你不能用下标形式去给vector添加元素

并且必须明确的一点是

只能对确知已存在的元素执行下标的操作

试图用下标的形式去访问一个不存在的元素将引发错误

发表评论

您的电子邮箱地址不会被公开。