Jouen 2012-12-25
vector 有称为容器。头文件:#include<vector> ;using声明:using std::vector; vector是一个类模板,可用于多个不同的数据类型。
注解:vector是一个类模板,而不是一个数据类型。
1. vector对象的定义和初始化
vector<int> v1; //默认构造函数初始v1为空
vector<int> v2(v1); //v1的副本
vector<int> v3(5,12); //包含5个值为12 的元素
vector<int> v4(3); //包含值初始化的元素的3个副本
关键概念:vector对象的动态增长
可在运行时高效地添加元素。虽然可预先分配内存,当更有效的方法是先初始化一个空的vector对象,然后再动态地增加元素。
如果vector保存内置类型,将用0值初始化;如果是类类型,将调用默认构造函数。
2.vector对象的操作
//1.size()和empty(),与string类似
if(v3.empty() == false)
{
vector<int>::size_type vs = v3.size();
cout<<"v3 size: "<<vs<<endl;
}
添加元素到vector对象后面:
int n ;
while(cin>>n)
{
v2.push_back(n);
}
下标操作:
for(vector<int>::size_type ix = 0;ix!=v3.size();ix++)
{
if(ix%2==0)
{
v3[ix] = 18 ;
}
cout<<v3[ix]<<" ";
}
关键概念:安全的泛型编程
上例中for循环判断条件用!=而不是用<来判断,没有在for循环之前就调用size函数并保存其值,而是在for语句头中调动size成员函数。
c++程序员习惯于优先使用!=而不是<来判断。调用 size成员函数而不是保存其返回值是个良好的编程习惯。在C++中,有些数据结构是动态增长的,循环可以很容易地增加新元素,若确实增加了,那么用已保存的size值作为循环条件就会有问题,应为没有将新加入的元素计算在内。所以倾向于在每次循环中测试size的当前值。
可能会觉得每次调用size函数对性能的影响,C++中的有些函数可以声明为inline函数。像size这样的小库函数都可以定义为内联(inline)函数,所以每次循环过程中调用它的运行是代价是比较小的。
仅能对已存在的元素进行下标操作。