@[TOC](C++: vector (1))
哈喽,编程搭子们!😜 又到了沉浸式敲代码的快乐时间~把生活调成「代码模式」,带着满满的热爱钻进编程的奇妙世界——今天也要敲出超酷的代码,冲鸭!🚀
在这里插入图片描述

✨ 我的博客主页:喜欢吃燃面
📚 我的专栏(持续更新ing):
《C语言》 |
《C语言之数据结构》 |
《C++》 |
《Linux学习笔记》

💖 超感谢你点开这篇博客!真心希望这些内容能帮到正在打怪升级的你~如果有任何想法、疑问,或者想交流学习心得,都欢迎留言/私信,咱们一起在编程路上互相陪伴、共同进步呀!

本文思维导图

C++ vector

基本使用

构造析构

迭代器

容量操作

元素访问

修改操作

emplace_back

直接构造

避免拷贝

性能更优

遍历方式

迭代器

范围for

结构化绑定

一、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;
}

运行结果如下:
在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐