@[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 operatorsvector 的关系运算符(函数模板)
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编程工具,助力开发者即刻编程。

更多推荐