C++:vector(1)
·
@[TOC](C++: vector (1))
哈喽,编程搭子们!😜 又到了沉浸式敲代码的快乐时间~把生活调成「代码模式」,带着满满的热爱钻进编程的奇妙世界——今天也要敲出超酷的代码,冲鸭!🚀
✨ 我的博客主页:喜欢吃燃面
📚 我的专栏(持续更新ing):
《C语言》 |
《C语言之数据结构》 |
《C++》 |
《Linux学习笔记》
💖 超感谢你点开这篇博客!真心希望这些内容能帮到正在打怪升级的你~如果有任何想法、疑问,或者想交流学习心得,都欢迎留言/私信,咱们一起在编程路上互相陪伴、共同进步呀!
本文思维导图
一、vector的基本使用
1. 成员函数
1.1 成员函数 (Member functions)
| 函数名 | 功能说明 (中文) |
|---|---|
| (constructor) | 构造 vector(公有成员函数) |
| (destructor) | vector 析构函数(公有成员函数) |
| operator= | 赋值内容(公有成员函数) |
1.2 迭代器 (Iterators)
| 函数名 | 功能说明 (中文) |
|---|---|
| begin | 返回指向起始位置的迭代器(公有成员函数) |
| end | 返回指向末尾位置的迭代器(公有成员函数) |
| rbegin | 返回指向反向起始位置的反向迭代器(公有成员函数) |
| rend | 返回指向反向末尾位置的反向迭代器(公有成员函数) |
| cbegin | 返回指向起始位置的 const 迭代器(公有成员函数) |
| cend | 返回指向末尾位置的 const 迭代器(公有成员函数) |
| crbegin | 返回指向反向起始位置的 const 反向迭代器(公有成员函数) |
| crend | 返回指向反向末尾位置的 const 反向迭代器(公有成员函数) |
1.3 容量 (Capacity)
| 函数名 | 功能说明 (中文) |
|---|---|
| size | 返回元素个数(公有成员函数) |
| max_size | 返回可容纳的最大元素个数(公有成员函数) |
| resize | 改变容器大小(公有成员函数) |
| capacity | 返回当前已分配的存储容量大小(公有成员函数) |
| empty | 测试 vector 是否为空(公有成员函数) |
| reserve | 请求改变容器的容量(公有成员函数) |
| shrink_to_fit | 收缩至合适大小(公有成员函数) |
以上是 C++ 标准库中 std::vector 容器的成员函数、迭代器、容量相关接口说明,属于 C++ 编程知识里 STL(标准模板库)的内容,以下是关键信息梳理:
成员函数:
负责 vector 对象的创建、销毁、赋值:
- 构造函数:创建 vector 对象
- 析构函数:销毁对象,释放内存资源
- operator=:赋值运算符,实现容器间内容拷贝
迭代器:
用于遍历 vector 元素的工具,分两类:
- 正向迭代器:
begin(起始)、end(结束) - 反向迭代器:
rbegin(反向起始)、rend(反向结束) - const 迭代器(
cbegin/cend/crbegin/crend):只读遍历,禁止修改元素
容量:
管理 vector 内存大小与元素数量:
size:获取当前元素个数max_size:理论最大可存储元素数resize:调整容器内元素个数capacity:已分配内存可容纳元素总数empty:判断容器是否为空reserve:预分配内存,优化扩容效率shrink_to_fit:收缩内存至实际元素占用大小
2.常用方法
2.1 元素访问 (Element access)
| 函数名 | 功能说明 (中文) |
|---|---|
operator[] |
访问元素(公有成员函数) |
at |
访问元素(公有成员函数,带越界检查) |
front |
访问第一个元素(公有成员函数) |
back |
访问最后一个元素(公有成员函数) |
data |
访问底层数据指针(公有成员函数) |
2.2 修改器 (Modifiers)
| 函数名 | 功能说明 (中文) |
|---|---|
assign |
赋值 vector 内容(公有成员函数) |
push_back |
在末尾添加元素(公有成员函数) |
pop_back |
删除末尾元素(公有成员函数) |
insert |
插入元素(公有成员函数) |
erase |
擦除元素(公有成员函数) |
swap |
交换内容(公有成员函数) |
clear |
清空内容(公有成员函数) |
emplace |
构造并插入元素(公有成员函数) |
emplace_back |
在末尾构造并插入元素(公有成员函数) |
2.3 分配器 (Allocator)
| 函数名 | 功能说明 (中文) |
|---|---|
get_allocator |
获取分配器(公有成员函数) |
2.4 非成员函数重载 (Non-member function overloads)
| 函数名 | 功能说明 (中文) |
|---|---|
relational operators |
vector 的关系运算符(函数模板) |
swap |
交换两个 vector 的内容(函数模板) |
以上是是 C++ 标准库中 std::vector 容器的部分成员函数及相关操作说明,涵盖以下类别:
- 元素访问(Element access):
- operator[]:通过下标访问元素,不做越界检查 。
- at:通过下标访问元素,会做越界检查,越界抛 out_of_range 异常 。
- front:访问第一个元素 。
- back:访问最后一个元素 。
- data(C++11 及以上 ):返回指向容器数据起始位置的指针,用于直接操作底层数据 。
- 修改操作(Modifiers):
- assign:重新赋值容器内容,可替换现有元素 。
- push_back:在容器末尾添加元素 。
- pop_back:删除容器末尾元素 。
- insert:在指定位置插入元素 。
- erase:删除指定位置元素 。
- swap:交换两个 vector 的内容 。
- clear:清空容器元素 。
- emplace(C++11 及以上 ):在指定位置直接构造并插入元素,减少拷贝/移动开销 。
- emplace_back(C++11 及以上 ):在末尾直接构造并插入元素 。
- 分配器(Allocator):get_allocator:获取容器使用的分配器,用于内存管理相关操作 。
- 非成员函数重载(Non - member function overloads):
- relational operators:vector 的关系运算符重载(如 ==、< 等 ),用于比较两个 vector 。
- swap:非成员函数版 swap,交换两个 vector 内容,可通过 ADL(参数依赖查找 )调用 。
以上这些是 std::vector 常用的操作接口,用于元素访问、增删改、内存与内容管理等场景 。
3. 示例代码如下
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void test01()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
vector<int>::iterator it = v1.begin();
while (it < v1.end())
{
cout << *it << endl;
it++;
}
cout << endl;
vector<int> v2(4, 2);
for (auto e : v2)
{
cout << e << " ";
}
cout << endl;
vector<int> v3(v1.begin(), v1.end());
for (int i = 0; i < v3.size(); i++)
{
cout << v3[i] << " ";
}
cout << endl;
}
void test02()
{
vector<int> v;
size_t old = v.capacity();
for (int i = 0; i < 110; i++)
{
v.push_back(i);
if (old != v.capacity())
{
cout << v.capacity() << endl;
old = v.capacity();
}
}
cout << endl;
vector<int> v1 = { 1,2,3,4,5,6,7,8 };
v1.insert(v1.begin(), 100);
v1.insert(v1.begin() + 2, 66);
auto pos = std::find(v1.begin(), v1.end(), 5);
if (pos < v1.end())
{
v1.insert(pos, 77);
}
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
v1.erase(v1.begin() + 5);
v1.erase(v1.begin() + 3, v1.end());
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
}
int main()
{
test01();
test02();
return 0;
}
4.结果展示

(注:不同编译器运行结果可能存在差异)
二.emplace_back与遍历(补充)
emplace_back 是 C++ 容器(如 vector)的函数,用于直接在容器尾部构造对象,避免额外的拷贝或移动操作。相比 push_back(需先构造对象再添加到容器),它更高效,尤其适用于构造复杂对象或性能敏感场景。在多数情况下,emplace_back与push_back差别不大。
请看以下代码:
#include<iostream>
#include<vector>
using namespace std;
void test01()
{
struct A
{
A(int a1 = 1, int a2 = 1) : _a1(a1), _a2(a2)
{
}
int _a1;
int _a2;
};
A aa1(0,0);
vector<A> v;
v.push_back(aa1);
v.push_back(A(2, 2));
v.push_back({ 3,2 });
v.emplace_back(aa1);
v.emplace_back(A(2,2));
//传构造参数效率较高
v.emplace_back(3, 2);
vector<A>::iterator it = v.begin();
while (it < v.end())
{
cout << it->_a1 << " " << it->_a2;
it++;
}
cout << endl;
for (auto& e : v)
{
cout << e._a1 << " " << e._a2;
}
cout << endl;
//C++17标准 结构化绑定
auto& [x, y] = aa1;
for (auto& [x,y] : v)
{
cout << x<< " " << y;
}
}
int main()
{
test01();
return 0;
}
运行结果如下:
更多推荐




所有评论(0)