vector是STL容器中最基础的容器,它内部通过一个动态数组实现。也可以理解成C++普通数组的升级版。主要有以下特点:
1、支持动态扩容:可以根据需要增加或者减少存储空间,元素在内存中是连续存储的。
2、因为其内部使用动态数组实现,所以支持高速访问,可以直接通过索引访问,访问速度快。
3、自动内存管理:不需要手动释放内存,vector容器会自动管理内存。
4、插入和删除的时间复杂度较高,因为每次插入和删除操作都会移动大量的数组中的元素。
容器的大概为代码如下:
template<typename T>
class vector {
T* _data; // 指向动态分配的数组
size_t _size; // 当前元素个数
size_t _capacity;// 当前分配的容量
// ...
};
容器的创建
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//方法一:默认创建空vector容器 不会分配内存
vector<int> values;
//容器扩容到指定大小
values.reserve(20);
//方法二:创建容器的同时 初始化容器中的元素
vector<int> values2 = { 1,2,3,4,5,6,8,5,74,8,9, };
//方法三:初始化容器时,指定容量capacity大小,并且可以使用默认值初始化所有元素
vector<int> values3(10, 0);
//方法四:通过其他容器来初始化一个新的容器
vector<int> values4(values3);
}
新增元素
向vector容器新增元素主要有push_back
和insert
两个方法,push_back
向容器的尾部新增一个元素,insert
可以向容器的任意索引处新增一个元素。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values;
//向容器尾部添加一个元素
values.push_back(1);
values.push_back(2);
for (auto i = values.begin(); i < values.end(); i++)
{
cout << *i << " ";
}
values.insert(values.begin() + 1, 3);
for (auto i = values.begin(); i < values.end(); i++)
{
cout << *i << " ";
}
}
移除元素
移除容器中的元素,主要用到pop_back
、erase
和clear
三个方法,pop_back
删除容器的最后一个元素,erase
删除指定索引处的元素,clear
清空容器中的所有元素。
#include <iostream>
#include <vector>
using namespace std;
void PrintVector(vector<int>& v)
{
for (auto i = v.begin(); i < v.end(); i++)
{
cout << *i << " ";
}
cout << endl;
}
int main()
{
vector<int> values;
//向容器尾部添加三个元素
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
values.push_back(5);
//删除最后一个元素
values.pop_back();
PrintVector(values);
//移除指定索引处的元素
values.erase(values.begin() + 1);
PrintVector(values);
cout << "元素大小" << values.size() << endl;
values.clear(); //清空容器
cout << "元素大小" << values.size() << endl;
}
resize函数:调整容器元素大小
vector的resize函数用于改变容器元素的大小,主要作用是扩大容器和缩小容器。
1、当指定的值大于当前元素个数,vector会在末尾添加默认元素。使容器中元素的大小扩大到指定值。
2、当指定的小于当前元素个数,vector会删除默认的元素。使容器中元素的大小缩小到指定值。
#include <iostream>
#include <vector>
using namespace std;
void PrintVector(vector<int>& v)
{
for (auto i = v.begin(); i < v.end(); i++)
{
cout << *i << " ";
}
cout << endl;
}
int main()
{
vector<int> values;
//向容器尾部添加三个元素
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
values.push_back(5);
values.resize(10); //扩展容器大小为10
PrintVector(values);
}
执行结果如下:

当我们将resize的参数从10改成3之后,容器中元素会缩小。执行结果如下:可以看到,原来5个元素的后面两个被移除掉了。

迭代器:正向迭代器、逆向迭代器、常量迭代器
(1)、 顺序迭代器:当正向遍历容器的时候使用
begin():返回指向第一个元素的迭代器(正向,读写)。
end():返回指向最后一个元素的下一个位置的迭代器(正向,读写)。
(2)、 反向迭代器:当逆向遍历容器的时候使用
rbegin():返回指向最后一个元素的反向迭代器(逆序遍历,读写)。
rend():返回指向第一个元素前一个位置的反向迭代器(逆序遍历,读写)。
(3)、常量迭代器(只读):在顺序迭代器和反向迭代器的基础上增加了const,不允许修改对应的元素值。
cbegin():返回指向第一个元素的常量迭代器(正向,只读)。
cend():返回指向最后一个元素的下一个位置的常量迭代器(正向,只读)。
crbegin():返回指向最后一个元素的常量反向迭代器(逆序,只读)。
crend():返回指向第一个元素前一个位置的常量反向迭代器(逆序,只读)。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values;
//向容器尾部添加三个元素
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
values.push_back(5);
for (auto i = values.begin(); i < values.end(); i++)
{
cout << *i << " ";
}
cout << endl;
for (auto i = values.rbegin(); i != values.rend(); ++i)
{
cout << *i << " ";
}
}
执行结果如下:

shrink_to_fit:将内存减少到等于当前元素实际所使用的大小。
这个函数相当于将动态数组尾部没有填充的元素全部删掉。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values;
//向容器尾部添加三个元素
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
values.push_back(5);
values.reserve(10);
cout << "容量" << values.capacity() << endl;
values.shrink_to_fit();
cout << "容量" << values.capacity() << endl;
}
执行效果如下:

其他常用vector函数
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> values;
//向容器尾部添加三个元素
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
values.push_back(5);
cout << "元素容量:" << values.capacity() << endl;
cout << "元素个数:" << values.size() << endl;
cout << "元素最大个数(很大):" << values.max_size() << endl;
cout << "元素是否为空:" << values.empty() << endl;
cout << "第n 个元素引用:" << values.at(1) << endl;
cout << "第一个元素引用:" << values.front() << endl;
cout << "最后一个元素引用:" << values.back() << endl;
cout << "动态数组的指针:" << *values.data() << endl;
}
执行效果如下:
