【C语言基础】C++ 中的 `vector` 及其 C 语言实现详解

一、C++ 中的 vector:动态数组的核心特性

1. 基本概念
vector 是 C++ 标准模板库(STL)中的动态数组容器,支持自动扩容、高效元素访问和丰富的操作接口。其核心特性包括:

  • 动态内存管理:自动调整容量,避免手动管理内存。
  • 连续存储:元素在内存中连续存放,支持随机访问(时间复杂度 O(1))。
  • 类型安全:通过模板实现,支持任意数据类型。

2. 核心操作

  • 初始化与遍历

    cpp 复制代码
    #include <vector>
    std::vector<int> vec = {1, 2, 3}; // 初始化
    for (int num : vec) { /* 范围循环 */ }
  • 插入与删除

    cpp 复制代码
    vec.push_back(4);    // 尾部插入
    vec.pop_back();      // 尾部删除
    vec.insert(vec.begin() + 1, 5); // 中间插入
    vec.erase(vec.begin());         // 中间删除
  • 容量管理

    cpp 复制代码
    vec.reserve(100);    // 预分配容量
    vec.shrink_to_fit(); // 释放多余内存

3. 性能优化

  • 扩容策略 :默认容量翻倍增长,可通过 reserve 减少扩容次数。
  • 移动语义(C++11+):避免深拷贝,提升对象传递效率。

4. 适用场景

  • 需要动态调整大小的数组(如读取未知数量数据)。
  • 高频随机访问元素的场景(如排序、查找)。

二、C 语言实现动态数组(仿 vector

1. 结构设计

通过结构体封装动态数组的核心参数:

c 复制代码
typedef struct {
    void* data;         // 数据指针
    size_t size;        // 当前元素数量
    size_t capacity;    // 分配的总容量
    size_t elem_size;   // 单个元素大小(字节)
} Vector;

2. 核心功能实现

  • 初始化与销毁

    c 复制代码
    Vector vector_init(size_t elem_size, size_t capacity) {
        Vector vec;
        vec.elem_size = elem_size;
        vec.capacity = (capacity > 0) ? capacity : 1;
        vec.data = malloc(vec.capacity * elem_size);
        return vec;
    }
    
    void vector_destroy(Vector* vec) {
        free(vec->data);
        vec->data = NULL;
    }
  • 动态扩容

    c 复制代码
    void vector_resize(Vector* vec, size_t new_capacity) {
        void* new_data = realloc(vec->data, new_capacity * vec->elem_size);
        vec->data = new_data;
        vec->capacity = new_capacity;
    }
  • 元素操作

    c 复制代码
    void vector_push_back(Vector* vec, const void* value) {
        if (vec->size >= vec->capacity) {
            vector_resize(vec, vec->capacity * 2); // 容量翻倍
        }
        memcpy((char*)vec->data + vec->size * vec->elem_size, value, vec->elem_size);
        vec->size++;
    }
    
    void* vector_at(Vector* vec, size_t index) {
        return (char*)vec->data + index * vec->elem_size;
    }

3. 使用示例

c 复制代码
int main() {
    Vector vec = vector_init(sizeof(int), 2);
    int a = 10, b = 20;
    vector_push_back(&vec, &a);
    vector_push_back(&vec, &b);
    printf("%d", *(int*)vector_at(&vec, 1)); // 输出 20
    vector_destroy(&vec);
    return 0;
}

三、C++ vector 与 C 实现的对比
特性 C++ vector C 实现
内存管理 自动扩容与释放(RAII) 需手动调用 resizedestroy
类型安全 模板支持,编译时类型检查 依赖 void*,需手动类型转换
功能扩展 支持迭代器、STL 算法 需自行实现排序、查找等功能
性能优化 移动语义、预分配策略 需手动优化内存对齐或批量操作
异常处理 抛出 std::out_of_range 等异常 直接终止程序或返回错误码

四、开发建议
  1. C++ 场景

    • 优先使用 vector,避免重复造轮子。
    • 结合 reserveemplace_back 提升性能。
  2. C 语言场景

    • 封装内存操作函数(如 vector_push_bulk)减少冗余代码。

    • 添加边界检查宏增强安全性:

      c 复制代码
      #define VECTOR_SAFE_ACCESS(vec, index) \
          ((index < vec.size) ? vector_at(&vec, index) : NULL)
  3. 跨语言协作

    • 在混合编程时,可通过 C 动态数组传递数据,再由 C++ 封装为 vector

五、总结

C++ 的 vector 通过模板和标准库支持,提供了高效便捷的动态数组操作;而 C 语言需手动实现类似功能,虽灵活性高,但开发成本较大。理解两者的底层机制,有助于在不同场景下合理选择数据结构,优化程序性能与可维护性。

相关推荐
汉克老师2 分钟前
CSP-J 初赛(以满分为目标):第二十七课 《图的遍历——BFS广度优先搜索——像“水波纹”一样,一层一层地搜索》
c++·csp-j·小学生·学c++编程
闻缺陷则喜何志丹5 分钟前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
tedcloud1238 分钟前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源
AAA代码批发商14 分钟前
Days 39 Linux C 开发之 SQLite 数据库完整学习笔记
linux·c语言·数据库
汉克老师23 分钟前
CSP-J 初赛(以满分为目标):第二十六课 《图的遍历——DFS深度优先搜索——从“树的先序遍历”走进真正的图世界》
c++·csp-j·小学生·学c++编程
Tanjia_kiki26 分钟前
谷歌浏览器中F12编辑并重发请求
开发语言·前端·javascript
程序猿编码29 分钟前
基于GGML的C++17轻量化语音推理引擎:说话人识别与语音分析技术全解析
开发语言·c++·pytorch·深度学习·神经网络·大模型
影视飓风TIM1 小时前
C++哈希表深度剖析:冲突处理、rehash、迭代器与unordered容器封装
c++·哈希算法·散列表
传奇开心果编程1 小时前
【Rust入门知识点学与练】第5课:函数
开发语言·学习·rust
秋田君1 小时前
Qt_QMediaPlayer类与QMediaPlaylist类
开发语言·qt