STL : Standard Template Library, C++ 标准模板库, 封装好了各种接口供我们调用。vector是模板类,是容器的一种,是不定长的数组,可以在尾部增加删除元素,获取数组大小等。容器还有set, map, list, stack, queue等... 我们在算法竞赛中必定会用到。
本文实例代码在https://github.com/zzxzzk115/STL_vector
我们先来看看vector的使用方法:
先引入头文件
#include
<vector>
当然别忘了
#include
<iostream>
using
namespace
std;
再就是vector对象的创建, vector模板类有很多构造函数,所以在创建对象时也有多种创建方法(在main中创建):
vector<
int> v1;
//创建空vector
vector<
int>
v2(v1);
//从v1拷贝至新vector
vector<
int>
v3(
5);
//创建含5个元素的vector
vector<
int>
v4(
5,
0);
//创建含5个0的vector
为了方便观察我们的vector对象中都有哪些元素,我们可以用迭代器来遍历vector对象,然后打印。为此我们先看begin()和end()的使用:(可以把迭代器理解为指针, begin()指向vector对象的头部,end()指向vector对象的尾部)
void
PrintVector(vector<
int> ve)
{
cout <<
"Vector中的数据为:";
vector<
int>::iterator veIterator;
for (veIterator = ve.
begin(); veIterator < ve.
end(); veIterator++)
{
cout << *veIterator <<
" ";
}
cout << endl;
}
接下来可以愉快的玩耍了,pop_back() push_back() 顾名思义,向尾部增加、向尾部删除嘛, so easy.
在main函数中测试一下:
v1.
push_back(
5);
v1.
push_back(
4);
v1.
push_back(
8);
PrintVector(v1);
结果是
![](https://img-blog.csdn.net/2018022015075886?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
如何访问某一位置的元素呢?用 [index] 或 at(index) 来访问,(index是索引值, 从0开始)
cout << v1[
0] << endl;
cout << v1.
at(
1) << endl;
cout << v1[
2] << endl;
结果是
![](https://img-blog.csdn.net/20180220151151385?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
我们还可以访问头尾的数据: back() front()
cout << v1.
back() << endl;
cout << v1.
front() << endl;
结果是
![](https://img-blog.csdn.net/20180220151450534?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
max_size()获取最大容纳量,size()获取当前vector对象元素个数
cout <<
"v1中的最大容量为:" << v1.
max_size() << endl;
cout <<
"v1中的元素个数为:" << v1.
size() << endl;
结果是
![](https://img-blog.csdn.net/20180220151801369?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
empty() 返回1即为空,返回0即不为空
cout <<
"v1是否为空?" << v1.
empty() << endl;
结果是
![](https://img-blog.csdn.net/20180220152252791?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
sort()可对vector升序, reverse()可对vector降序
sort(v1.
begin(), v1.
end());
PrintVector(v1);
reverse(v1.
begin(), v1.
end());
PrintVector(v1);
结果是
![](https://img-blog.csdn.net/2018022015263534?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
swap()可交换vector数据
swap(v1, v4);
PrintVector(v1);
PrintVector(v4);
结果为
![](https://img-blog.csdn.net/20180220153133534?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
erase()删除元素,insert()插入元素,不过一定要用迭代器
先看erase, insert同理把erase换成insert是一样的
PrintVector(v4);
vector<
int>::iterator vErase = v4.
begin();
vErase = vErase +
1;
v4.
erase(vErase);
PrintVector(v4);
结果是
![](https://img-blog.csdn.net/20180220155342788?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
clear()清空vector元素
PrintVector(v4);
v4.
clear();
cout <<
"v4是否为空? " << v4.
empty() << endl;
结果是
![](https://img-blog.csdn.net/20180220160040605?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemt4OTgxMTA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
以下是文档:
http://en.cppreference.com/w/cpp/container/vector