一. vector的介绍
vector就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样高效。但与数组不同的是,它们的大小可以动态变化,其存储由容器自动处理。
在内部,向量使用动态分配的数组来存储其元素。可能需要重新分配此数组,以便在插入新元素时增加大小,这意味着分配一个新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,向量都不会重新分配。
二. vector的使用
2.1. vector的定义
|--------------------------------------------------------------|-----------------|
| 构造函数声明 | 功能说明 |
| vector() | 无参构造 |
| vector( size_type n, const value_type& val = value_type() ) | 用n个值为val的构造 |
| vector(const vector& x) | 用一个已存在的vector构造 |
| vector (InputIterator first, InputIterator last) | 用一段迭代区间构造 |
cpp
void Test_vector1()
{
vector<int> v1;//无参构造
vector<int> v2(10,1);//用10个1进行构造
vector<int> v3(v1);//用存在的vector来构造新的
vector<int> v4(v2.begin(), v2.end());//用一段迭代区间来构造
}
2.2. vector iterator的使用
|-------------------|------------------------|
| iterator的使用 | 接口说明 |
| begin() + end() | 获取第一个位置的数据+获取最后一个位置的数据 |
| rbegin() + rend() | 获取最后一个位置的数据+获取第一个位置的数据 |
cpp
void Test_vector(const vector<int>& v)
{
// const对象使用const迭代器进行遍历打印
vector<int>::const_iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
}
2.3. vector空间增长问题
|----------|-------------------|
| 容量空间 | 接口说明 |
| size | 获取数据个数 |
| capacity | 获取容量大小 |
| empty | 判断是否为空 |
| resize | 改变vector的size |
| reserve | 改变vector的capacity |
- capacity的代码在vs和g++下分别运行会发现,**vs下capacity是按1.5****倍增长的,**g++是按2
倍增长的 。这个问题经常会考察,不要固化的认为, vector 增容都是 2 倍,具体增长多少是
根据具体的需求定义的。 vs 是 PJ 版本 STL , g++ 是 SGI 版本 STL 。- reserve 只负责开辟空间,如果确定知道需要用多少空间, reserve 可以缓解 vector 增容的代
价缺陷问题。- resize 在开空间的同时还要进行初始化,影响size。
cpp
void Test_vector3()
{
vector<int> v;
for (int i = 1; i < 10; i++)
v.push_back(i);
v.resize(5);
v.resize(8, 100);
v.resize(12);
cout << "v contains:";
for (size_t i = 0; i < v.size(); i++)
cout << ' ' << v[i];
cout << endl;
}
2.4. vector的增删查改
|--------------|-----------------|
| vector的增删查改 | 接口说明 |
| push_back | 尾插 |
| pop_back | 尾删 |
| find | 查找 |
| insert | 在pos位置之前插入val |
| erase | 删除pos位置的值 |
| swap | 交换两个vector的数据空间 |
| operatot[] | 像数组一样访问 |
cpp
void Test_vector4()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
auto it = v.begin();
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
v.pop_back();
v.pop_back();
it = v.begin();
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
}
cpp
void Test_vector5()
{
// 使用列表方式初始化,C++11新语法
vector<int> v{ 1, 2, 3, 4 };
// 在指定位置前插入值为val的元素,比如:3之前插入30,如果没有则不插入
// 1. 先使用find查找3所在位置
// 注意:vector没有提供find方法,如果要查找只能使用STL提供的全局find
auto pos = find(v.begin(), v.end(), 3);
if (pos != v.end())
{
// 2. 在pos位置之前插入30
v.insert(pos, 30);
}
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
++it;
}
cout << endl;
pos = find(v.begin(), v.end(), 3);
// 删除pos位置的数据
v.erase(pos);
it = v.begin();
while (it != v.end()) {
cout << *it << " ";
++it;
}
cout << endl;
}
cpp
void Test_vector6()
{
vector<int> v{ 1, 2, 3, 4 };
// 通过[]读写第0个位置。
v[0] = 10;
cout << v[0] << endl;
// 1. 使用for+[]小标方式遍历
for (size_t i = 0; i < v.size(); ++i)
cout << v[i] << " ";
cout << endl;
vector<int> swapv;
swapv.swap(v);
cout << "v data:";
for (size_t i = 0; i < v.size(); ++i)
cout << v[i] << " ";
cout << endl;
// 2. 使用迭代器遍历
cout << "swapv data:";
auto it = swapv.begin();
while (it != swapv.end())
{
cout << *it << " ";
++it;
}
// 3. 使用范围for遍历
for (auto x : v)
cout << x << " ";
cout << endl;
}