最近在C++中频繁的使用到了vector,给我的第一感觉就是这个容器太强大了,简直就是一切皆可装,而且它的容量一般也不需要关心,编译器也会根据你的vector中所装元素的数量进行动态的分配容量,可以把它看作是一个加强版的数组;
在需要使用到vector的工程中首先需要引入相关头文件
#include
定义初始化vector:
简单理解就是:< >中是表示装入vector的数据类型,然后是数组名;
vector<int> vec;//默认size=0,capacity=0
vector<int> vec(10);//初始化size=10,capacity=10,所有元素默认值为0
vector<int> vec(10,666);//初始化size=10,capacity=10,所有元素默认值为666
vector<int> vec_2(vec);//定义一个和vec完全相同的vector
vector<vector<float>> vec;//vector中装入vector类型的元素
vector<Point> vec;
...
vector的大小(size)是指已经初始化的元素数量,容量(capacity)则是指当前最多能够装进去多少元素;
这里顺便提一下vector的容量分配的规则:
我在VS中实验的结果是:容量按照1.5倍的规则进行分配,在网上也有看到说这与系统等有关,有的则是按照两倍的原则进行分配,以下代码是我在VS中验证的结果:
...
vector<int> vec(10);
cout << "vec.size: " << vec.size() << endl;
cout << "vec.capacity:" << vec.capacity() << endl;
cout << "------------------------"<< endl;
vec.push_back(1);
cout << "vec.size: " << vec.size() << endl;
cout << "vec.capacity:" << vec.capacity() << endl;
...
直接通过下标 i 访问vector内指定的元素:
利用vec[i]或vec.at(i)访问指定元素;例:
vector<int> vec(10,666);
cout << vec[1] << endl;
cout << vec.at(5) << endl;
使用迭代器 iterator 访问vector内元素的值:
vec.begin():得到vec的头指针;
vec.end():得到vec的尾指针(最后一个元素的下一个单元的指针);
例:
int main()
{
vector<int> vec;
for (int i = 0; i < 10; i++)//初始化
{
v.push_back(i);
}
vector<int>::iterator iter = vec.begin();
while (iter != vec.end())
{
cout << "Value of vec[" << j << "] = " << *iter << endl;
iter++;
}
return 0;
}
注:这的begin()和end()是一对,返回的都是迭代器类型的指针;
返回vector中最后一个元素:
vector::back( ):返回的是vector最后一个元素;例:
cout << vec.back() << endl;
返回vector中第一个元素:
vector::front( ):返回的是vector第一个元素;例:
cout << vec.front() << endl;
注:这的front()和back()是一对,返回的是首末元素;
获取vector的容量和大小:
vector::size():函数显示vecytor的实际大小;例:
cout << vec.size() << endl;
vector::capacity():函数显示vecytor的容量;例:
cout << vec.capacity() << endl;
在末尾插入元素:
vector::push_back(x):在vector的末尾插入一个元素x,如果有必要会自动扩充容量。
vector::push_back()
删除最后一个元素:
vector::pop_back(),例:
vec.pop_back();
删除指定位置元素:
vector::erase(iterator),例:
vector<int>::iterator iter = vec.begin();
vec.erase(iter+5);//删除指定下标出元素
//不用迭代器
vec.erase(iter+5);
vector<int> temp(0);
temp.erase(temp.begin()+5,temp.begin()+10);//删除temp中指定范围的元素
清空vector中所有的元素:
vector::clear(),例:
vec.clear();
注:清空后容量capacity不变,size变为0,删除元素同理;
函数中形参的定义:
void Init(vector &v);
例:
void Init(vector<int> &v)
{
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
}
函数调用时实参的传入:
Init(vec);
例:
int main()
{
vector<int> vec;
Init(vec);
for (int j = 0; j < vec.size(); j++)
{
cout << "Value of vec[" << j << "] = " << vec[j] << endl;
}
return 0;
}
运行结果:
更多关于vector参数传递的方式参考博客:C++(笔记)容器(vector)作为函数参数如何传参
sort(a.begin(), a.end());
struct Area//结构体定义
{
int id;
double area;
};
bool cmp_area(const struct Area &a, const struct Area &b)
{
return a.area > b.area;//进行从大到小排序
//return a.area < b.area;//进行从小到大排序
}
vector<struct Area> convex_area(contours.size());
sort(convex_area.begin(), convex_area.end(),cmp_area);//对convex_area按area大小进行排序
其他参考博客:
1.C++ 中vector的用法详解
2.C++ 中vector的使用方法