跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ STL Vector 容器部分实现及使用

C++ STL Vector 容器部分实现及使用主要涵盖基础框架构建与默认成员函数实现。内容包括模板类定义、底层指针管理(_start, _finish, _endofstorage)及大小容量计算逻辑。详细解析了默认构造函数、拷贝构造函数、区域构造函数及初始化列表构造函数的编写方式与性能优化点,如避免不必要的元素拷贝。

二进制发布于 2026/3/15更新于 2026/9/1077 浏览

一、基本框架构建

与 string(专门存储字符的容器)不同,vector 是通用动态数组,可存储满足复制/赋值要求的任意类型(如 int、自定义类),并支持嵌套使用,如 vector(本质是容器的容器,但在逻辑上可看作一个存储 int 类型数据的二维数组方便理解)。

1. 基本框架

关于 vector 类的成员变量的创造,可以参考一部分 STL 源代码:

  • 创建模板:为了能够将类型参数化,允许用户在实例化 vector 时显式指定存储的数据类型。
namespace mosheng {
template<class T>
class vector {
public:
    typedef T* iterator; // 类型参数化的指针
    // size()
    size_t size() const {
        return _finish - _start;
    }
    // capacity()
    size_t capacity() const {
        return _endofstorage - _start;
    }
private:
    iterator _start; // 指向容器底层数组的起始位置
    iterator _finish; // 指向容器中最后一个有效元素的下一个位置
    iterator _endofstorage; // 指向容器已分配空间最后一个位置的下一个位置
};
}

_finish - _start 即为 size(容器大小),_endofstorage - _start 即为 capacity(容器容量)。

注意:模板声明和定义不能分离(.h 与 .cpp)。

二、默认成员函数

构造函数(move 版本暂不实现):

2.1 默认构造函数 (default)

代码示例:

// 方式 1
// vector() :_start(nullptr) ,_finish(nullptr) ,_endofstorage(nullptr) {}

// 方式 2:成员函数要给上缺省值
iterator _start = nullptr;
iterator _finish = nullptr;
iterator _endofstorage = ;


() = ;
nullptr
// 强制编译器生成默认构造
vector
default

第二种我们是否可以直接不显式实现默认构造函数?而是让编译器自动生成?当然可以,不过前提是没有其他构造函数的前提下。一旦有了其他的构造函数,编译器就不会再自动生成默认构造函数,用这种办法能够强制生成默认构造。

2.2 拷贝构造函数 (copy)

代码示例:

// 拷贝构造
vector(const vector<T>& v) {
    reserve(v.capacity());
    for (auto& e : v) // 相当于:T& e = *it(it 是迭代器)
    {
        push_back(e);
    }
}
  1. 函数主要完成的是:先通过 reserve(v.capacity()) 预先分配足够空间,再通过遍历原容器 v,将 v 中的元素逐一复制到当前对象中。
  2. 关于使用 (auto &e : v) 而非 (auto e : v):避免在遍历 v 容器时进行不必要的拷贝。
    • 不加引用:每次迭代时,v 中的元素都会拷贝到临时变量 e 中去(若 T 为自定义类型,调用 T 的拷贝构造)。
    • 加引用:e 直接绑定到 v 中的元素,无需进行拷贝,大大提升了效率。

2.3 区域构造函数 (range)

代码示例:

// 区域构造函数
template<class InputIterator>// 任意容器迭代器类型化
vector(InputIterator first, InputIterator last) {
    while (first != last) {
        push_back(*first);
        first++;
    }
}
  1. 添加模板将任意迭代器类型化,这样就能够用各种类型的容器(如 list,vector,string 等)去构造函数。

2.4 初始化列表构造函数 (initializer list)

1. 初步了解一下 initializer_list 模板类

引入:std::initializer_list 是 C++11 引入的一个轻量级模板类,用于表示初始化列表(花括号 {} 包裹的值列表)。

  1. 要使用 initializer_list 首先要包含头文件 <initializer_list>。
  2. 这种类型的对象由编译器从初始化列表声明中自动构造,而初始化列表声明是由一个大括号括起来,用逗号分隔元素的列表,il 就是一个 initializer_list 类型。
  3. 它类似于开一个数组如:int arr[] = { 10, 20 , 30},不过 il 对象里面存储的实际是两个指针,一个指向起始位置,一个指向末尾,其并非直接存储数组内容。

目录

  1. 一、基本框架构建
  2. 1. 基本框架
  3. 二、默认成员函数
  4. 2.1 默认构造函数 (default)
  5. 2.2 拷贝构造函数 (copy)
  6. 2.3 区域构造函数 (range)
  7. 2.4 初始化列表构造函数 (initializer list)
  8. 1. 初步了解一下 initializer_list 模板类

更多推荐文章

查看全部
  • 全球情报监控平台 World Monitor 开源项目介绍
  • GraphRAG 技术解析:原理、部署与商业应用探讨
  • AI Agent 安全警示与工具演进:从 Meta 事故到 Claude Code 及 Python 3.15 JIT 进展
  • Stable Diffusion 的工程实现:训练、推理与 LoRA 微调
  • 发那科机器人与西门子 PLC 通讯方案(网关+Modbus TCP)
  • 2026 年最新机器人系统架构与技术路线分析
  • VSCode 中 GitHub Copilot 安装与实战指南
  • Windows 环境下 Git 安装与配置指南
  • Java 岗位面试经验:JVM、分布式、消息队列与协议
  • AIGC 工作流技术资产化与商业化变现指南
  • GitHub Copilot 学生认证申请指南与常见问题排查
  • HTB Fries 靶机实战:从 Gitea 凭据泄露到 AD CS 证书攻击
  • 红黑树插入修复全记录:从旋转到颜色调整
  • 自适应图像变焦与边界框变换用于无人机目标检测
  • Windows 安装 OpenCode AI 编码助理踩坑与解决方案
  • C++ 面试常见基础问题与特性解析
  • 2024 年中国 AI 大模型场景应用趋势蓝皮书
  • 基于 Spring Cloud Alibaba 与 Nacos 的微服务负载均衡实践
  • 支持二次开发管理端的标准化 Skill Agent 框架选型
  • Scala 内建控制结构:if 表达式实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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