【模板类】Vector
Vector简介
向量(Vector) 是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
容器特性
顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算术进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。
能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
对象创建方法和成员函数介绍
注意
使用vector需要包含vector类所在的头文件:
#include <vector>
对象创建方法
vector<类型>标识符
:创建一个存储某类型元素的空向量。
vector<类型>标识符(初始容量)
:创建一个具有初始容量长度,其中元素值全为默认初值的向量。
vector<类型>标识符(初始容量,初始所有值)
:创建一个具有初始容量长度,其中元素值全为初始所有值的向量。
// 创建对象
vector<int> nums1; // nums1 ={}
vector<int> nums2(4); // nums2 = {0,0,0,0}
vector<int> nums3(4, 1); // nums3 = {1,1,1,1}
// 创建对象的同时进行初始化
vector<int> nums4 = {1, 2, 3, 4};
vector<vector<int>> nums5 = {{1, 2}, {3, 4}};
成员函数介绍
-
push_back
在数组的最后添加一个数据 -
pop_back
去掉数组的最后一个数据 -
at
得到编号位置的数据 -
begin
得到数组头的指针 -
end
得到数组的最后一个单元+1的指针 -
front
得到数组头的引用 -
back
得到数组的最后一个单元的引用 -
max_size
得到vector最大可以是多大 -
capacity
当前vector分配的大小 -
size
当前使用数据的大小 -
resize
改变当前使用数据的大小,如果它比当前使用的大,则填充默认值 -
reserve
改变当前vector所分配空间的大小 -
erase
删除指针指向的数据项 -
clear
清空当前的vector -
rbegin
将vector反转后的开始指针返回(其实就是原来的end-1) -
rend
将vector反转构的结束指针返回(其实就是原来的begin-1) -
empty
判断vector是否为空 -
swap
与另一个vector交换数据
vector<int> nums1 = {1, 2, 3, 4};
// 增删操作
nums1.push_back(5); //{1,2,3,4,5}
nums1.pop_back(); //{1,2,3,4} 【注意:5只是被移出了nums1,未在内存中被移除,当前的end()仍指向5的位置】
nums1.erase(nums1.end() - 1); //{1,2,3}【注意:4只是被移出了nums1,未在内存中被移除,当前的end()指向4】
// 获取容量
cout << nums1.empty() << endl; //输出0
cout << nums1.size() << endl; //输出3
cout << nums1.capacity() << endl; //输出8【让capacity大于size的原因是为了避免每次添加新元素都要重新分配内存,各编译器对capacity的分配处理不同】
cout << nums1.max_size() << endl; //输出4611686018427387903【vector分配的大小:2^62-1】
// 改变大小
nums1.resize(7); //{1,2,3,0,0,0,0}【resize操作改变的是size】
nums1.reserve(9); //{1,2,3,0,0,0,0}【reserve操作改变的是capacity】
cout << nums1.capacity() << endl; //输出9
// 取值操作
cout << nums1.at(0) << endl; //输出1
cout << *nums1.begin() << "," << *nums1.end() << endl; //输出1,-1163005939【注意:begin()和end()得到的是指针,需要用星号取得数值】
cout << nums1.front() << "," << nums1.back() << endl; //输出1,0【注意:front()和back()得到的是引用,即不能通过改变它们改变vector原来的数值】
// 反转取值
for (int i = 0; i < nums1.size(); i++) {
cout << *(nums1.rbegin() + i) << ","; //依次输出0,0,0,0,3,2,1,
}
cout << endl;
for (int i = 0; i < nums1.size(); i++) {
cout << *(nums1.rend() - 1 - i) << ","; //依次输出1,2,3,0,0,0,0
}
cout << endl;
// 交换数据
vector<int> nums2 = {4, 3, 2, 1};
nums1.swap(nums2); //nums1变为{4,3,2,1},nums2变为{1,2,3,0,0,0,0}
// 清空数据
nums1.clear(); //nums1变为{}
cout << nums1.empty() << endl; //输出1