目录
1. vector的介绍
1.1 什么是vector?
vector 是C++ STL(标准模板库)中的一种顺序容器,本质上可以理解为:
动态顺序表(动态数组)
它的特点:
-
底层是连续空间
-
支持随机访问
-
支持动态扩容
-
尾插尾删效率高
使用时需要:
#include <vector>
using namespace std;
2. vector的基本定义
2.1 无参构造
vector<int> v;
创建一个空vector。
2.2 构造n个元素
vector<int> v(5, 1);
结果:
1 1 1 1 1
2.3 拷贝构造
vector<int> v1(5, 1);
vector<int> v2(v1);
2.4 迭代器区间构造
vector<int> v1(5, 1);
vector<int> v2( v1.begin(), v1.end() );
迭代器的介绍见以下内容
3. vector迭代器
vector支持迭代器遍历。
3.1 begin 和 end
vector<int>::iterator it = v.begin();
说明:
| 接口 | 作用 |
|---|---|
| begin() | 第一个元素位置 |
| end() | 最后元素下一个位置 |
3.2 迭代器遍历
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v{1,2,3,4,5};
vector<int>::iterator it = v.begin();
while(it != v.end())
{
cout << *it << " ";
++it;
}
return 0;
}
3.3 范围for遍历
C++11推荐写法:
for(auto e : v)
{
cout << e << " ";
}
3.4 修改元素
for(auto& e : v)
{
e *= 2;
}
4. vector容量接口
4.1 size()
获取有效元素个数。
cout << v.size();
4.2 capacity()
获取容量大小。
cout << v.capacity();
4.3 empty()
判断是否为空。
if(v.empty())
{
cout << "为空";
}
4.4 resize()
修改size。
vector<int> v;
v.resize(10, 1);
结果:
1 1 1 1 1 1 1 1 1 1
resize特点
扩容时
会开空间,初始化
缩容时
仅减少有效数据,capacity一般不变。
4.5 reserve()
预留空间。
v.reserve(100);
作用:
-
只改变capacity
-
不改变size
reserve的重要意义
提前扩容:
vector<int> v;
v.reserve(100000);
可以减少:
-
扩容次数
-
数据搬迁次数
提高效率。
5. vector扩容机制
5.1 VS下扩容
VS通常按1.5倍扩容。
5.2 g++下扩容
Linux下通常2倍扩容
6. vector增删查改
6.1 push_back()
尾插。
v.push_back(10);
6.2 pop_back()
尾删。
v.pop_back();
6.3 operator[]
像数组一样访问。
cout << v[0];
6.4 insert()
插入。
v.insert(v.begin(), 100);//头插
v.insert(v.begin()+3, 100);//下标为3的位置插入
6.5 erase()
删除。
v.erase(v.begin());//尾删
v.erase(v.begin()+3);//下标为3的位置删除
ps:(insert,erase只能传迭代器,不能像string一样传下标)
6.6 swap()
交换两个vector。
v1.swap(v2);
6.7 find()
find不是vector成员函数。
属于算法库:
#include<algorithm>
示例
auto pos = find(v.begin(), v.end(), 3);
7. vector迭代器失效
7.1 什么是迭代器失效?
vector底层本质:
T*
即指针。
如果:
-
空间被释放
-
元素被移动
那么原来的迭代器:
指向非法空间
继续使用:
-
程序崩溃
-
结果错误
7.2 哪些操作会导致失效?
① 扩容相关
例如:
push_back
insert
reserve
resize
assign
因为:
旧空间会释放
示例
vector<int> v{1,2,3};
auto it = v.begin();
v.reserve(100);
cout << *it;
此时:
it已经失效
7.3 erase导致失效
错误写法
while(it != v.end())
{
if(*it % 2 == 0)
v.erase(it);
++it;
}
为什么错?
因为:
erase(it)
之后:
it已经失效
继续:
++it
非法。
正确写法
while(it != v.end())
{
if(*it % 2 == 0)
it = v.erase(it);
else
++it;
}
erase返回值
erase会返回:
删除位置下一个元素的迭代器
因此必须接收。
8. vector二维数组理解
定义二维vector
vector<vector<int>> vv(n);
本质:
vv中每个元素
本身又是vector<int>
示例
vector<vector<int>> vv(5);
相当于:
vv有5行
每行是一个vector<int>
但:
每行开始为空
resize后
vv[i].resize(i+1, 1);
每行元素初始化为1。

3693

被折叠的 条评论
为什么被折叠?



