一 点睛
1 基本概念
向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。
与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。
在使用它时, 需要包含头文件 vector
#include<vector>
vector容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作。
vector区别于一般数组的特性之一就是能够动态的“扩容”,大小和容量的概念至关重要。
vector的大小(size)是指当前元素所占用空间,而容量(capacity)则是指vector分配内存预留大小,当size超过capacity时,vector会自动进行扩容,重新分配内存。
容器的大小和容器的容量是有区别的,大小是指元素的个数,容量是分配的内存大小,容量一般不小于容器的大小。
vector::size()返回容器的大小,vector::capacity()返回容量值。容量多于容器大小 的部分用于以防容器大小增加的使用。每次重新分配内存都会影响程序性能,所以一般分配的容量都大于容器的大小,若要自己指定分配的容量的大小,则可以使用vector::reserve(),但是规定的值要大于size()值。
2 优点
- 可以使用下标访问个别的元素。
- 迭代器可以按照不同的方式遍历容器。
- 可以在容器的末尾增加或删除元素。
3 向量初始化举例
vector<int> a ; // 声明一个int型向量a
vector<int> a(10) ; // 声明一个初始大小为10的向量
vector<int> a(10, 1) ; // 声明一个初始大小为10且初始值都为1的向量
vector<int> b(a) ; // 声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ; // 将a向量中从第0个到第2个(共3个)作为向量b的初始值
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
4 向量遍历的三种方式
- for(int i=0;i<a.size();i++)
- for(iter=ivector.begin();iter!=ivector.end();iter++)
- for_each
二 vector的初始化和遍历
1 代码
#include <vector>
#include <iostream>
using namespace std;
int main(){
int a[7]={1,2,3,4,5,6,7};
/*vector的赋值并不可以像数组一样方便的用花括号方便的完成赋值,这里借用了数组来初始化这个vector
初始化方式采用vector<elementType> intvec(begin,end);*/
vector<int> ivector(a,a+7);
vector<int>::iterator iter;
// 使用迭代器进行遍历
for (iter=ivector.begin();iter!=ivector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
// 单个vector的赋值,这个方式看上去还是和数组一样的
ivector[5]=1;
cout<<ivector[5]<<endl<<ivector.size()<<endl;
for (iter=ivector.begin();iter!=ivector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
// 使用for循环的方式进行遍历
for(int i=0;i<5;i++){
cout<<ivector[i]<<" ";
}
cout<<endl;
return 0;
}
2 运行
[root@localhost charpter03]# g++ 0308.cpp -o 0308
[root@localhost charpter03]# ./0308
1 2 3 4 5 6 7
1
7
1 2 3 4 5 1 7
1 2 3 4 5
三 for_each的遍历实战
1 代码
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
void print(int n)
{
cout<<n<<" ";
}
int main(){
int a[7]={1,2,3,4,5,6,7};
vector<int> ivector(a,a+7);
vector<int>::iterator iter;
for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历
cout<<endl;
ivector[5]=1;
cout<<ivector[5]<<endl<<ivector.size()<<endl;
for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历
return 0;
}
2 运行
[root@localhost charpter03]# g++ 0309.cpp -o 0309
[root@localhost charpter03]# ./0309
1 2 3 4 5 6 7
1
7
1 2 3 4 5 1 7