C++ STL容器--vector详解
2026/5/15 20:04:21 网站建设 项目流程

目录

1. vector的介绍

1.1 什么是vector?

2. vector的基本定义

2.1 无参构造

2.2 构造n个元素

2.3 拷贝构造

2.4 迭代器区间构造

3. vector迭代器

3.1 begin 和 end

3.2 迭代器遍历

3.3 范围for遍历

3.4 修改元素

4. vector容量接口

4.1 size()

4.2 capacity()

4.3 empty()

4.4 resize()

resize特点

扩容时

缩容时

4.5 reserve()

reserve的重要意义

5. vector扩容机制

5.1 VS下扩容

5.2 g++下扩容

6. vector增删查改

6.1 push_back()

6.2 pop_back()

6.3 operator[]

6.4 insert()

6.5 erase()

6.6 swap()

6.7 find()

示例

7. vector迭代器失效

7.1 什么是迭代器失效?

7.2 哪些操作会导致失效?

① 扩容相关

示例

7.3 erase导致失效

错误写法

为什么错?

正确写法

erase返回值

8. vector二维数组理解

定义二维vector

示例

resize后

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。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询