整理自wiki、菜鸟教程、W3Cschool
什么是Vector
Vector 是C++标准程序库中的一个类,可视为会自动扩展容量的数组,以循序(Sequential)的方式维护变量集合。vector的特色有支持随机存取,在集合尾端增删元素很快,但是在集合中间增删元素比较费时。vector是C++标准程序库中的众多容器(container)之一。 vector以模板(泛型)方式实现,可以保存任意类型的变量,包括用户自定义的数据类型,例如:它可以是放置整数(int)类型的 vector、也可以是放置字符串(string)类型的 vector、或者放置用户自定类别(user-defined class)的 vector。(from:wiki)
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。(from:runoob)
在c++中,vector是一个十分有用的容器。它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。(from:w3cschool)
特性
- 顺序序列:顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
- 动态数组:支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
- 内存分配器感知:容器使用一个内存分配器对象来动态地处理它的存储需求。
注意⚠
如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;
Vector作为函数的参数或者返回值时,需要注意它的写法:
double Distance(vector<int>&a, vector<int>&b)
使用方法
基本方法
- 引入头文件
#include <vector>
- 创建vector对象
vector<int> vec;
- 在尾部插入一个元素
vec.push_back(a);
- 在尾部删除一个元素
vec.pop_back();
- 使用下标访问
cout << vec[0] << endl;
- 使用迭代器访问
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << endl;
- 在第
i+1
个元素前插入a
vec.insert(vec.begin()+i,a);
- 删除第三个元素
vec.erase(vec.begin()+2);
- 删除区间
[i,j-1]
,区间从0
开始
vec.erase(vec.begin()+i,vec.end()+j);
- 获取长度
vec.size();
- 清空
vec.clear();
- 逆序,需要引入头文件
#include<algorithm>
reverse(vec.begin(),vec.end());
- 使用
sort
排序,需要引入头文件#include<algorithm>
sort(vec.begin(),vec.end()); // 默认升序
/* 通过重写排序算法降序排列 */
bool Comp(const int &a,const int &b)
{
return a>b;
}
sort(vec.begin(),vec.end(),Comp); // 调用
二维数组定义
方法1:
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N = 5, M = 6;
vector<vector<int>> obj(N); //定义二维动态数组大小5行
for(int i = 0; i < obj.size(); i++) //动态二维数组为5行6列,值全为0
{
obj[i].resize(M);
// resize()改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
}
for(int i = 0; i< obj.size(); i++)//输出二维动态数组
{
for(int j = 0; j < obj[i].size(); j++)
{
cout << obj[i][j] << " ";
}
cout << "\n";
}
return 0;
}
方法2:
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N = 5, M = 6;
vector<vector<int>> obj(N, vector<int>(M)); //定义二维动态数组5行6列
for(int i = 0; i < obj.size(); i++) //输出二维动态数组
{
for(int j = 0; j < obj[i].size(); j++)
{
cout << obj[i][j] << " ";
}
cout << "\n";
}
return 0;
}
结构体类型元素
注意⚠:结构体要定义为全局!
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef struct rect
{
int id;
int length;
int width;
//对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
bool operator< (const rect &a) const
{
if(id!=a.id)
return id<a.id;
else
{
if(length!=a.length)
return length<a.length;
else
return width<a.width;
}
}
}Rect;
int main()
{
vector<Rect> vec;
Rect rect;
rect.id=1;
rect.length=2;
rect.width=3;
vec.push_back(rect);
vector<Rect>::iterator it=vec.begin();
cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;
return 0;
}