【C++指南】vector(一):从入门到详解

【C++指南】vector(一):从入门到详解
.💓 博客主页:倔强的石头的ZEEKLOG主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注

文章目录

std::vector 是 C++ STL 中最核心的动态数组容器,支持高效随机访问和动态扩容。本文从 基础用法深度优化 两个维度,系统解析其构造函数、迭代器、容量管理、元素访问和修改操作,涵盖函数重载、参数差异及相似函数对比,并提供丰富的代码示例。


一、默认成员函数

在这里插入图片描述

1. 默认构造函数

  • 语法vector<T> vec;
  • 行为:创建空容器,容量为 0,不分配内存。

示例

std::vector<int> vec;// 空 vector

2. 元素数量构造函数

  • 语法vector<T> vec(n, val);
  • 行为
    • vector<T> vec(n):创建包含 n 个默认初始化元素的容器(如 int 初始化为 0)。
    • vector<T> vec(n, val):创建包含 n 个值为 val 的元素的容器。

示例

std::vector<int>vec1(5);// {0, 0, 0, 0, 0} std::vector<int>vec2(3,10);// {10, 10, 10}

3. 迭代器范围构造函数

  • 语法vector<T> vec(iter_start, iter_end);
  • 行为:用其他容器的迭代器范围初始化 vector

示例

std::list<int> lst ={1,2,3}; std::vector<int>vec(lst.begin(), lst.end());// {1, 2, 3}

4. 初始化列表构造函数(C++11 起)

  • 语法vector<T> vec{1, 2, 3};
  • 行为:直接通过列表初始化元素。

示例

std::vector<int> vec ={4,5,6};// {4, 5, 6}

5. 拷贝构造函数与赋值运算符

  • 行为:深拷贝容器内容,新旧容器完全独立。

示例

std::vector<int> vec1 ={1,2,3}; std::vector<int>vec2(vec1);// 拷贝构造 vec2 = vec1;// 赋值操作

语法

vector<T>vec2(vec1);// 拷贝构造 vec2 = vec1;// 赋值运算符

二、迭代器相关函数

在这里插入图片描述

1. 基础迭代器

函数功能示例
begin()返回指向第一个元素的迭代器auto it = vec.begin();
end()返回指向末尾(最后一个元素之后)的迭代器for (auto it = vec.begin(); it != vec.end(); ++it)
rbegin()返回反向迭代器(从末尾开始遍历)auto rit = vec.rbegin();
rend()返回反向迭代器的结束位置while (rit != vec.rend())

2. 常量迭代器(C++11 起)

函数功能示例
cbegin()返回常量正向迭代器auto cit = vec.cbegin();
cend()返回常量正向迭代器的结束位置for (; cit != vec.cend(); ++cit)
crbegin()返回常量反向迭代器auto crit = vec.crbegin();
crend()返回常量反向迭代器的结束位置while (crit != vec.crend())

示例

std::vector<int> vec ={10,20,30};// 正向遍历for(auto it = vec.begin(); it != vec.end();++it){ std::cout <<*it <<" ";// 输出:10 20 30}// 常量反向遍历for(auto crit = vec.crbegin(); crit != vec.crend();++crit){ std::cout <<*crit <<" ";// 输出:30 20 10}

三、容量管理函数

在这里插入图片描述

1. 容量与大小控制

函数功能示例
size()返回当前元素数量int n = vec.size();
capacity()返回已分配的内存容量int cap = vec.capacity();
empty()检查容器是否为空if (vec.empty()) { ... }

2. 动态调整函数

resize(n, val) vs resize(n)
  • 行为差异
    • resize(5):若原大小为 3,新增 2 个默认值元素(如 int 为 0)。
    • resize(5, 10):新增的 2 个元素值为 10。
    • n < size(),超出部分的元素被销毁,但 容量不变
    • n>capacity(),将会引发扩容

语法

voidresize(size_t n);// 默认值填充voidresize(size_t n, T val);// 指定值填充

示例

std::vector<int> vec ={1,2,3}; vec.resize(5);// {1, 2, 3, 0, 0} vec.resize(3);// {1, 2, 3}(容量仍可能为 5) vec.resize(5,10);// {1, 2, 3, 10, 10}
reserve(n) vs shrink_to_fit()
  • reserve(n):预分配至少 n 个元素的内存,避免频繁扩容。
  • shrink_to_fit():请求释放未使用的内存,但 不保证容量等于 size()。该函数谨慎使用因为动态申请的内存不支持分段释放,缩容实际上是开辟了新的空间,释放了原有的空间,会有一定的效率牺牲

示例

std::vector<int> vec; vec.reserve(100);// 容量为 100 vec.push_back(1); vec.shrink_to_fit();// 容量可能变为 1(具体由实现决定)

四、元素访问函数

在这里插入图片描述

1. 下标访问与安全访问

特性operator[]at()
越界检查assert断言有(抛出 std::out_of_range
性能更高(直接访问)略低(需检查)
适用场景已知索引安全时需要异常处理的场景

示例

std::vector<int> vec ={10,20,30};int a = vec[3];// 未定义行为(可能崩溃或返回垃圾值)int b = vec.at(3);// 抛出异常:std::out_of_range

2. 首尾元素访问

函数功能示例
front()访问第一个元素vec.front() = 5;
back()访问最后一个元素vec.back() = 10;

对比 front()begin()

  • front() 返回元素引用,begin() 返回迭代器。
std::vector<int> vec ={1,2,3}; vec.front()=10;// 直接修改首元素auto it = vec.begin();*it =20;// 通过迭代器修改

3. 底层数据指针 data()

  • 语法T* data();
  • 行为:返回指向底层数组的指针(C++11 起支持)。

示例

std::vector<int> vec ={1,2,3};int* arr = vec.data();// 获取指针 arr[0]=10;// 直接修改元素

五、修改操作函数

在这里插入图片描述

1. 尾部操作

函数功能示例
push_back(val)在末尾添加元素(可能触发拷贝/移动)vec.push_back(4);
emplace_back(args)直接在末尾构造元素(避免临时对象)vec.emplace_back(1, 2.0);
pop_back()删除末尾元素vec.pop_back();

push_back vs emplace_back

  • push_back:需构造临时对象,再拷贝或移动到容器。
  • emplace_back:直接通过参数在容器内构造对象,效率更高。

示例

classData{public:Data(int a,double b){/* ... */}}; std::vector<Data> vec; vec.push_back(Data(1,2.0));// 构造临时对象,再移动 vec.emplace_back(1,2.0);// 直接在容器内构造

2. 插入与删除

insert 的多个重载版本

示例

std::vector<int> vec ={1,2,3}; vec.insert(vec.begin()+1,5);// {1, 5, 2, 3} vec.insert(vec.begin(),2,10);// {10, 10, 1, 5, 2, 3} std::list<int> lst ={7,8}; vec.insert(vec.end(), lst.begin(), lst.end());// 末尾追加 7, 8

语法

iterator insert(iterator pos,const T& val);// 插入单个元素voidinsert(iterator pos, size_t n,const T& val);// 插入 n 个相同元素voidinsert(iterator pos, InputIt first, InputIt last);// 插入迭代器范围//此范围包含 first 指向的元素,但不包含 last 指向的元素
erase 的用法

示例

std::vector<int> vec ={1,2,3,4,5}; vec.erase(vec.begin());// {2, 3, 4, 5} vec.erase(vec.begin(), vec.begin()+2);// {4, 5}

语法

iterator erase(iterator pos);// 删除单个元素 iterator erase(iterator first, iterator last);// 删除范围元素

3. 内容替换与清空

函数功能示例
assign替换容器内容vec.assign(3, 5); // {5,5,5}
clear()清空所有元素(容量不变)vec.clear();
swap交换两个容器的内容vec1.swap(vec2);

assign 的重载版本

std::vector<int> vec; vec.assign(3,5);// {5, 5, 5}(填充 n 个值) vec.assign({1,2,3});// {1, 2, 3}(初始化列表) std::list<int> lst ={7,8}; vec.assign(lst.begin(), lst.end());// {7, 8}(迭代器范围)

六、使用建议和注意事项

  1. 构造函数选择
    • 默认构造用 vector<T> vec;,预分配内存用 vector(n),列表初始化用 {}
  2. 容量管理
    • 频繁添加元素时优先 reserve(),可以减少频繁扩容的效率降低
  3. 元素访问
    • 安全场景用 operator[],需异常处理时用 at()
  4. 修改操作
    • 优先 emplace_back 减少拷贝,批量插入用 insert 的重载版本。
  5. 迭代器使用
    • 常量遍历用 cbegin()/cend(),反向遍历用 rbegin()/rend()

通过合理选择函数重载和参数,可以显著提升代码的效率和健壮性。

本文完

下篇文章将为读者讲解vector的底层原理和模拟实现

Read more

2026最新 Python+AI 入门指南:0基础也能快速上手,避开90%新手坑

2026最新 Python+AI 入门指南:0基础也能快速上手,避开90%新手坑

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:AI 文章目录: * 【前言】 * 一、为什么2026年入门AI,首选Python?(新颖热点解读) * 二、Python+AI入门必备:前提+环境搭建(10分钟搞定) * 2.1 核心前提(不用啃硬骨头) * 2.2 环境搭建(Windows/Mac通用,避版本冲突) * 三、Python+AI入门实战:3个热门案例(附完整代码) * 案例1:数据处理(AI入门必备,80%AI开发第一步) * 案例2:机器学习入门(线性回归,房价预测) * 案例3:2026热门·大模型对接(LangChain快速调用) * 四、

By Ne0inhk
【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

【 C/C++ 算法】入门动态规划-----一维动态规划基础(以练代学式)

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论 : 本章是动态规划算法的基础入门篇,我将通过三道简单题 + 一道中等难度的一维动态规划题来带你对动态规划有个初认识,并基本了解动态规划的最基本常见的写法,只有将基本写法了解了,对后续的难的题目自然也不会毫无头绪,后续还将持续更新更多相关的动规算法,敬请期待~🙃 ———————— 早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。 👻动态规划🌥️ 这里通过大量练习得出下面动态规划做题步骤 简单的说动态规划理解成:某种状态的公式 + 提前求出来值的容器 求出当前位置的值然后放到容器中后后续使用 因为最开始的值一般是会看见的所以就能有初始值,从而启动动态规划 从上中可以主要提炼出: * 状态 * 容器的重要性 * 公式,可以换种说法:状态转移方程 这样严格😈的说:动态规划 = 状态定义 + 状态转移方程 + 初始条件 + 状态存储(容器) 下述步骤是通过写完下述四道题后的总结,所以同样需要道友🗡️大量的练习沉淀最终就能对动态规划的题目

By Ne0inhk
告别付费行情软件:利用 QMT 免费“白嫖”全市场 Tick 级数据 (附 Python 代码)

告别付费行情软件:利用 QMT 免费“白嫖”全市场 Tick 级数据 (附 Python 代码)

前言:作为一名量化开发者,我每年最心疼的支出不是服务器费用,而是数据源费用。Wind 终端一年几万,Tushare 积分也要钱,稍微好点的 Tick 数据源动辄上千。但其实,很多散户手里就握着一把“金钥匙”却不自知——那就是券商免费提供的 QMT。今天,我将教你如何把 QMT 变成一个免费、稳定、实时的行情数据中心。 为什么 QMT 的数据最“香”? 在数据获取这条路上,我们通常有三个选择: 1. 爬虫:容易被封 IP,数据不稳定,且有法律风险。 2. 第三方 API (Tushare/JoinQuant):好用但要钱,免费版有各种限制(如延迟、限流)。 3. 券商 QMT/PTrade:完全免费,速度极快(

By Ne0inhk
蓝桥杯(C 语言 / C++)备考全攻略:3-6 个月从入门到上岸,语法 / 算法 / 真题 + 模板直接用

蓝桥杯(C 语言 / C++)备考全攻略:3-6 个月从入门到上岸,语法 / 算法 / 真题 + 模板直接用

蓝桥杯作为国内极具含金量的编程竞赛,是大学生提升编程能力、丰富简历的重要选择。本文针对 C 语言 / C++ 方向,打造 3-6 个月备考计划,从语法基础到算法进阶,再到真题实战,梳理高频考点并提供可直接复用的代码模板,帮你高效备考、稳步上岸。 一、备考规划:3-6 个月阶段拆解(零基础友好) 1. 基础阶段(1-2 个月):夯实语法与工具         核心目标:掌握 C/C++ 基础语法,熟练使用编译器(Dev-C++/VS Code),能独立编写简单程序。         每日学习时长:2-3 小时。 (1)语法重点(按优先级排序) * 核心语法:变量 / 常量、数据类型(int/long long/double/

By Ne0inhk