读书笔记:C++ Primer系列(6)—— 标准库类型之vector
2013-12-22 19:14 Keiven_LY 阅读(312) 评论(0) 编辑 收藏 举报题记:
继上一篇标准库类型string后,本篇继续讲述标准库类型中的容器(vector)。
6.1 标准库vector类型
- vector称为容器,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值
- 一个容器中的所有对象都必须是同一种类型
- 使用vector之前,必须包含相应的头文件,即:
#include <vector>
using std::vector;
- vector是一个类模版(class template)——使用模版可以编写一个类定义或函数定义,而用于多个不同的数据类型,但vector不是一种数据类型
- 声明从类模版产生的某种类型的对象,需要提供附加信息,信息的种类取决于模版,如:
vector<int> ivec; //定义ivec为含有若干int类型对象的vector
- 由于vector类型的每一种都指定了其保存元素的类型,因此像vector<int>,vector<string>等都是数据类型
6.2 vector对象的定义和初始化
6.2.1 vector对象的定义和初始化
表6-1 vector对象的几种初始化方式
- 对于vector保存内置类型的元素,标准库将用0值初始化所有的成员
如:vector<int> ivec(10); //这里10个整型的成员均初始化为0
vector<string> svec(10); //这里的10个元素均为空字符串
- 如果vector保存的是类类型,标准库将调用类的默认构造函数来初始化每一个数据成员;
- 如果类中定义了构造函数,但没有提供默认构造函数,初始化这种类型的vector对象时,除了提供vector对象所含的元素个数外,还必须指定每个元素的初始值
如:vector<int> ivec1(10,1);//这里10个整型的成员均初始化为1
vector<int> ivec2(ivec1); //这里的ivec2是ivec1的一个副本
vector<string> ivec3(ivec1); //错误,两个vector对象的类型必须一致
vector<string> ivec4(10, "hello"); //ivec4对象包含10个元素,均为“hello”字符串
注:vector对象的一个重要属性:可以在运行时高效地添加元素。
因此虽然可以对给定元素个数的vector对象预先分配内存,但更有效的方法是先初始化一个空vector对象,然后再动态地增加元素。(这一点比较重要)
6.2.2 vector对象的操作
表6-2 vector对象的几种操作
- vector对象的size和empty操作与string类型的相关操作类似,函数返回相应的vector类定义的size_type的值
注:使用size_type类型时,必须指出该类型是在哪里定义的。vector类型总是包括vector的元素类型。如下:
vector<int>::size_type; //正确
vector::size_type; //错误
程序清单—01
vector<int> vec; for(vector<int>::size_type i=0;i!= 10;i++) { vec[i]=i; cout<<vec[i]<<endl; }
上述程序试图向vec中插入0到9的10个元素,但是运行出错,原因在于:vector对象的下标只能用于获取已存在的元素,而程序清单中vec对象默认为空。
程序清单—02
#include <iostream> #include <vector> //标准库string类型头文件 using std::vector; //string类型的using声明 using std::cin; using std::cout; using std::endl; int main() { cout<<"方法1:这里初始化一个包含10个0的vector对象"<<endl; vector<int> vec(10,0); for(vector<int>::size_type i=0;i!= 10;i++) { vec[i]=i; cout<<vec[i]<<endl; } if(vec.empty()) { cout<<"容器vec是空的!"<<endl; } //方法2:使用push_back()函数 cout<<"方法2:使用push_back()函数"<<endl; vector<int> vec_new; for(vector<int>::size_type i=0;i!= 10;i++) { vec_new.push_back(i); cout<<vec_new[i]<<endl; } if(vec_new.empty()) { cout<<"容器vec_new是空的!"<<endl; } system("pause"); return 0; }
程序结果: