- C++STL容器篇之向量vector
- 什么是向量
- 向量vector和数组array的区别
- 向量vector和链表的区别
- 向量的基本用法
- 需要包含的头文件
- vector的创建方式
- vector的访问方式
- vector的遍历方式
- 向量的一些基本成员函数
- 简单地使用一下vector
在C++中向量是一个可以存放数据的容器,并且这个容器可以自动扩展(这一点和定长数组就有区别)。
向量vector和数组array的区别从肉眼就能直接看到的区别就是,数组array是定长的,在创建的时候就确定了内存大小,不能再改变。向量vector是动态的,在创建的时候可以确定大小,也可以不确定大小;创建之后,vector可以通过成员函数扩充内存大小。
向量vector和链表的区别链表也是可以扩充内存大小的,两者的区别就是,向量可以通过下标法访问数据,链表不可以。链表想访问数据必须是从头开始一个个访问。
向量的基本用法 需要包含的头文件vector头文件
#includevector的创建方式
关于vector的创建方式有很多中,这是因为它这个类的构造函数重载得多。因为是模板,所以尖括号是不能漏的,尖括号里存的是具体的数据类型,这里用int类型为例 。
vectorvector的访问方式vect; //没有确定长度 vector vect2(3); //确定长度是3,3个数据都是0 vector vect3(2, 1); //确定长度是2,并且用1填充内存,2个数据都是1 vector vect4(vect); //拷贝初始化 vector vect5 = vect; //拷贝初始化 vector vect6 = { 1,2,3 }; //列表初始化 int arr[3] = { 1,3,5 }; vector vect7(arr, arr + 2); //数组区域初始化 vector vect8(vect6.begin(), vect6.end()); //向量区域初始化
一共有两种访问方式:
- 下标法直接访问
- at成员函数法访问
vectorvect={5,1,1,3}; vect[2]=99; vect.at(3)=1001;
注意点:vector的访问必须在vector对象被分配内存的条件下才能访问。就比如上面的vect是vector的对象,已经初始化{5,1,1,3}的内存给它,这个时候可以使用下标法和成员函数法访问到里面的元素。
但如果是下面代码就不能访问到元素:
vectorvect; vect[0]=88; vect.at(0)=99;
这个代码就是错的。因为vect根本就没有分配到内存,所以也就没有访问内存的说法。
注意点:vector虽然是动态的,但是访问也是不能越界的。只有真的有内存了才能访问到里面的元素,不然会越界。这一点和数组是一样的性质。vector经过扩充后,就可以访问得到。
这一点很好理解,现在有5个房间,每个房间里有一个美女,你要进房间去和美女约会,你只能在这5个中选择,你不能访问第六个房间的美女,你要是想,那就只能从原来的5个房间扩充到6个房间,然后你才能访问到第六个房间。
vector的遍历方式一、类似数组版方式遍历
vectorvect = { 5,4,38,1,5 }; for (int i = 0; i < vect.size(); i++) { cout << vect[i] << 't'; } cout << endl;
二、新版for循环版遍历
vectorvect = { 5,4,38,1,5 }; for (auto v : vect) { cout << v << 't'; } cout << endl;
三、内置迭代器方式遍历
vector向量的一些基本成员函数vect = { 5,4,38,1,5 }; vector ::iterator iter; for (iter = vect.begin(); iter != vect.end(); iter++) { cout << *iter << 't'; } cout << endl;
| 成员函数名 | 功能 | 参数 |
|---|---|---|
| at | 访问向量的元素 | 向量元素的下标,从零开始计数 |
| size | 返回向量当前容器元素的个数 | 无 |
| capacity | 返回容器的大小 | 无 |
| empty | 判断容器是否为空,为空返回1,不为空返回0 | 无 |
| push_back | 往容器的尾部加一个元素 | 对应类型的元素 |
| assign | 用另一个容器赋值给当前容器 | 指定区域(指针表示)例如:arr,arr+3 |
| begin | 返回容器首元素的地址,返回的是迭代器不是指针 | 无 |
| end | 返回容器最后一个元素的下一个地址,返回的是迭代器不是指针 | 无 |
| front | 返回容器首元素的引用,相当于容器的第一个元素 | 无 |
| back | 返回容器最后一个元素的引用,相当于最后一个元素 | 无 |
| data | 返回容器首元素的地址,返回的是指针不是迭代器 | 无 |
| insert | 指定位置插入n个m元素 | 容器的位置,个数,要插入的元素 |
| clear | 清空容器,使容器为空,没有返回值 | 无 |
| erase | 一个参数:是指定删除该位置的元素 | 位置 |
| erase | 两个参数:是指定从第一个参数的位置删除元素一直到第二个位置结束 | 位置1,位置2 |
还有很多成员函数,建议直接去编译器上面玩,成员函数中还有重载函数。太多了。
简单地使用一下vector直接看代码:
#include#include using namespace std; int main() { vector vect(5, 6); cout <<"vect.empty()="< ::iterator iter; iter=vect.insert(vect.begin(), 99); cout << "*iter=" << *iter << endl; cout << "vect的元素:" << endl; for (int i = 0; i < vect.size(); i++) { cout << vect.at(i) << 't'; } cout << endl; iter = vect.insert(vect.begin() + 2, 1001); cout << "*iter=" << *iter << endl; cout << "vect的元素:" << endl; for (int i = 0; i < vect.size(); i++) { cout << vect.at(i) << 't'; } cout << endl; vect.pop_back(); cout << "删除最后一个元素之后:" << endl; for (iter = vect.begin(); iter != vect.end(); iter++) { cout << *iter << ' '; } cout << endl; return 0; }
输出结果:
vect.empty()=0 vect.size()=5 vect(5,6): 6 6 6 6 6 6 6 6 6 6 0 1 2 3 4 vect.size()=6 vect.clear()之后: vect.size()=0 vect重新插入数据: 1 2 3 4 5 *iter=99 vect的元素: 99 1 2 3 4 5 *iter=1001 vect的元素: 99 1 1001 2 3 4 5 删除最后一个元素之后: 99 1 1001 2 3 4
Cukor主页


![[17] C++STL容器篇之向量vector [17] C++STL容器篇之向量vector](http://www.mshxw.com/aiimages/31/296355.png)
