Vector 使用帮助:
(一)常用函数:包含#include<vector>
- push_back 在数组的最后添加一个数据
- pop_back 去掉数组的最后一个数据
- at 得到编号位置的数据
- begin 得到数组头的指针
- end 得到数组的最后一个单元+1的指针
- front 得到数组头的引用
- back 得到数组的最后一个单元的引用
- max_size 得到vector最大可以是多大
- capacity 当前vector分配的大小
- size 当前使用数据的大小
- resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
- reserve 改变当前vecotr所分配空间的大小
- erase 删除指针指向的数据项
- clear 清空当前的vector
- rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
- rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
- empty 判断vector是否为空
- swap 与另一个vector交换数据
- vec.insert(vec.begin()+i,a); 在第i+1个元素前面插入a;
(二)常用算法: 包含#include<algorithm>
(1) reverse(vec.begin(),vec.end()); //将元素翻转
(2) sort(vec.begin(),vec.end()); //排序 (默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
bool Comp(const int &a,const int &b) //定义排序比较函数
{
return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。
(三)常用函数代码实现:
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
int n = 5, i = 1;
vector<int> vec; //未指定初始化方式,因此采用默认方式初始化vec,即长度为0的空容器;
vector<int> vec2(vec); //定义对象v2,作为v1的副本;
vector<int> vec3 = vec; //定义对象v3,作为v1的副本;
vector<int> vec4(n, i); //定义对象v4,它包含n个数值为i的元素;
vector<int> vec5(n); //定义对象v5,v5中包含n个元素,每个元素的值均是0;
//推入5个值进向量
for(i = 0; i < 5; ++i)
{
vec.push_back(i);
}
//向量的大小
cout << vec.size() << endl;
// 数组下标方式遍历vector
for (i = 0; i < vec.size(); ++i)
{
cout << vec[i] << " ";
}
cout << endl;
//迭代器方式遍历vector
vector<int>::iterator itor = vec.begin();
for (; itor != vec.end(); ++itor)
{
cout << *itor << " ";
}
cout << endl;
//迭代器方式遍历const vector (注意:如果向量是常向量,那么迭代器在定义时也需要定义为常量)
const vector<int> vec6(5, 1);
vector<int>::const_iterator itor2 = vec6.begin();
for (; itor2 != vec6.end(); ++itor2)
{
cout << *itor2 << " ";
}
cout << endl;
//*************** 常用函数 ******************//
vec.push_back(10); //在向量尾部插入10
vec.pop_back(); //删除向量尾部的数据
cout << vec.empty() << endl; //输出0,vec不为空
cout << vec.front() << endl; //输出0,返回第1个元素的数据
cout << vec.back() << endl; //输出4,返回最后1个元素的数据
cout << vec.at(3) << endl; //输出第4个元素的值
vec.insert(vec.begin() + 1, 10); //在第2个元素前插入10
vec.insert(vec.begin(), 2, 11); //在第1个元素前插入2个11
vec.clear(); //清空后,size = 0
//erase() 使用迭代器,清空vector
vector<int>::iterator itor11 = vec.begin();
while(itor11 != vec.end())
{
itor11 = vec.erase(itor11);
}
return 0;
(四)vector 文字补充说明:
- vector 向量是一种顺序行容器。相当于数组,但是其大小可以不预先指定,并且自动扩展。他可以像数组一样通过使用[]符号被操作。因此可以将vector变量看做动态数组。
- vector 的分配方式:在创建vector变量后,它会自动在内存中分配一块连续的内存空间来保存数据,初始内存空间大小可以预先指定,也可以由vector默认指定大小。当存储的数据超过分配的空间时,vector会重新分配一块内存,但是这样的分配很耗时,在重新分配空间时它的步骤如下:
(1)vector 会申请一块更大的内存块;
(2)将原来的数据拷贝到新的内存块中;
(3)销毁掉原内存块中的对象(调用对象的析构函数);
(4)将原来的内存空间释放掉。
3. vector 的注意事项:当vector保存的数据量很大时,如果此时进行插入数据导致需要更大的空间来保存这些数据量,那么将会大大的影响程序运行的效率,所以我们应该合理地使用vector。
(五)vector的特点:
(1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样通过[]符号被操作。也可以进行动态操作,通常体现在push_back() pop_back();
(2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at();
(3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是vector 大多情况下并不是满存的,在未存储的区域实际是浪费的;
(4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现是按照顺序表的原理;
(5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop ;
(6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创建vector 时就指定其空间大小。
注:文章为综合总结,只为给自己提供编程时可用的工具书