跳到主要内容
C++ STL 详解:vector 容器使用指南 | 极客日志
C++ 算法
C++ STL 详解:vector 容器使用指南 综述由AI生成 Vector 是 C++ STL 中最常用的动态数组容器,支持自动扩容。涵盖构造方式(默认、填充、拷贝、范围)、迭代器操作(begin/end)、容量管理(size/capacity/reserve)、修改接口(push/pop/insert/erase)及访问方式(下标/范围循环)。重点解析了迭代器失效场景(扩容、插入、删除)及规避策略,适合希望深入理解内存管理与高效使用的开发者参考。
RefactorPro 发布于 2026/3/22 更新于 2026/5/2 6 浏览引言
在 C++ 的 STL 框架中,vector 无疑是最核心且实用的容器之一。与固定大小的传统数组不同,vector 克服了预定义大小的局限性,支持动态调整容量。简单来说,它是一个经过封装、功能丰富的可变数组。
核心优势
动态扩容 :无需预先确定大小,空间不足时底层会自动寻找更大内存并迁移数据。
内存安全 :自动管理内存分配与释放,减少手动 new/delete 带来的泄漏风险。
功能丰富 :内置大量工具函数,如获取大小、清空、尾部添加等。
vector 容器的构造方式
无参构造函数
构造一个空容器,元素类型任意。
#include <iostream>
#include <vector>
using namespace std;
class Student {
public :
void func () ;
private :
string _name;
int _age;
};
int main () {
vector<int > v1;
vector<double > v2;
vector<char > v3;
vector<string> v4;
vector<Student> v5;
return 0 ;
}
填充构造函数
构造包含 n 个元素的容器,每个元素为 value 的副本。
#include <iostream>
#include <vector>
using std;
{
:
() {}
;
:
string _name;
_age;
};
{
;
;
;
;
;
;
}
namespace
class
Student
public
Student
void func ()
private
int
int main ()
vector<int > v1 (5 , 1 )
vector<char > v2 (10 , 'a' )
vector<double > v3 (15 , 3.14 )
vector<string> v4 (20 , "C++" )
vector<Student> v5 (5 )
return
0
拷贝构造函数 用已存在的 vector 构造新容器,按顺序拷贝元素。
#include <iostream>
#include <vector>
using namespace std;
int main () {
vector<int > v1 (10 , 1 ) ;
vector<int > v2 = v1;
return 0 ;
}
范围构造函数 利用迭代器区间 [first, last) 构造,支持从普通数组、其他容器(如 set)转换。
#include <iostream>
#include <vector>
int main () {
int arr[] = {10 , 20 , 30 , 40 , 50 };
std::vector<int > v (arr, arr + 5 ) ;
return 0 ;
}
#include <iostream>
#include <vector>
int main () {
std::vector<int > source = {1 , 2 , 3 , 4 , 5 , 6 , 7 };
std::vector<int > sub_v (source.begin() + 1 , source.begin() + 5 ) ;
return 0 ;
}
场景 C:跨容器转换(如 set 转 vector)
#include <iostream>
#include <vector>
#include <set>
int main () {
std::set<int > my_set = {5 , 1 , 9 , 3 , 5 , 1 };
std::vector<int > v (my_set.begin(), my_set.end()) ;
return 0 ;
}
vector 迭代器 vector 的迭代器底层通常就是原生指针,因为元素存储在连续内存中。
普通迭代器 :typedef T* iterator;(可读可改)
常量迭代器 :typedef const T* const_iterator;(只读不改)
begin 与 end
begin():返回指向第一个元素的迭代器。
end():返回指向最后一个元素之后位置的迭代器。
int main () {
vector<int > v (10 , 6 ) ;
vector<int >::iterator it = v.begin ();
while (it != v.end ()) {
cout << *it << " " ;
++it;
}
cout << endl;
return 0 ;
}
vector 的容量操作
size vector<int > myVec;
myVec.push_back (10 );
cout << myVec.size ();
capacity vector<int > myVec;
for (int i = 1 ; i <= 10 ; ++i) {
myVec.push_back (i);
cout << "Size: " << myVec.size () << ", Capacity: " << myVec.capacity () << endl;
}
reserve vector<int > myVec;
myVec.reserve (100 );
resize
n > size:扩展,新增元素用指定值初始化(默认 0)。
n < size:缩小,超出部分被移除。
empty
vector 的修改操作
push_back vector<int > numbers;
numbers.push_back (10 );
numbers.push_back (20 );
pop_back
insert void printVector (const vector<int >& v) {
for (int num : v) cout << num << " " ;
cout << endl;
}
int main () {
vector<int > vec = {10 , 20 , 30 };
printVector (vec);
vec.insert (vec.begin (), 5 );
printVector (vec);
auto it = vec.insert (vec.begin () + 2 , 15 );
printVector (vec);
vec.insert (vec.end (), 100 );
printVector (vec);
return 0 ;
}
erase int main () {
vector<int > nums = {15 , 42 , 28 , 50 , 33 , 60 };
for (auto iter = nums.begin (); iter != nums.end (); ) {
if (*iter > 30 && *iter % 2 == 0 ) {
iter = nums.erase (iter);
} else {
++iter;
}
}
return 0 ;
}
vector 的访问
operator[] vector<int > scores = {85 , 92 , 78 , 90 };
scores[1 ] = 100 ;
范围 for 循环
按值遍历 :适合小对象读取,有拷贝开销。
按引用遍历 :适合修改数据,无拷贝开销。
常量引用遍历 :适合大对象只读,安全高效。
for (const auto & item : vec) {
}
for (auto & item : vec) {
}
迭代器失效 vector 迭代器本质是指针,一旦底层内存变动,旧迭代器即失效。
场景一:扩容导致全局失效 当 push_back 等操作触发扩容(size > capacity),内存会重新分配,所有旧迭代器失效。
vector<int > vec = {1 , 2 , 3 };
vec.reserve (3 );
auto it = vec.begin ();
vec.push_back (4 );
场景二:元素挪动导致局部失效 insert 或 erase 未触发扩容时,目标位置及之后的迭代器失效。
vector<int > vec;
vec.reserve (10 );
vec.push_back (10 ); vec.push_back (20 ); vec.push_back (30 );
auto it_target = vec.begin () + 1 ;
vec.insert (it_target, 99 );
场景三:范围 for 中的增删 在 range-for 内部修改容器 size 极其危险,建议改用传统迭代器循环。
注意事项
尽量使用 reserve() 预先分配内存,避免频繁扩容。
erase 和 insert 务必使用返回值更新迭代器。
避免在 range-for 中修改容器大小。
掌握 vector 的这些特性,能帮助你在 C++ 开发中更安全、高效地管理动态数据。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online