C++ STL vector容器详解:从原理到实践

06-02 1606阅读

引言

亲爱的小伙伴们,今天我要和大家分享一个C++编程中的"神器"——vector容器!作为STL(标准模板库)中最常用的容器之一,vector就像是一个"超级数组",既有数组的高效随机访问特性,又能自动调整大小,让你告别固定大小数组的困扰。不管你是刚接触C++的新手,还是想深入理解vector实现原理的老手,这篇博客都能带给你新的收获!

一、什么是vector?

想象一下,你正在收集各种小玩具,但不确定最终会有多少个。用普通数组的话,你得提前决定一个上限,太小了不够用,太大了又浪费空间。这时候,vector就像一个神奇的收纳盒,它能根据你放入的玩具数量自动调整大小!

定义与特点

  • 动态数组:vector是一个能够存放任意类型的动态数组
    • 连续内存:vector中的元素在内存中连续存储,支持高效的随机访问
      • 自动扩容:当空间不足时,vector会自动分配更大的内存空间
        • 类型安全:通过模板机制确保类型安全

          vector的内部结构

          从实现原理上看,vector内部维护三个关键指针:

          指向数据的起始位置 —— start

          指向最后一个元素的下一个位置 —— finish

          指向分配的内存空间的尾端 —— end_of_storage

          !vector内部结构示意图

          这就像一个能伸缩的宿舍:

          • start是宿舍的门口
            • finish是最后一名同学睡的床位后面一点的位置
              • end_of_storage是宿舍的墙壁(容量上限)

                二、vector的基本操作

                创建vector

                #include 
                // 创建空vector
                std::vector vec1;
                // 创建包含5个元素的vector,所有元素初始化为0
                std::vector vec2(5);
                // 创建包含5个元素的vector,所有元素初始化为10
                std::vector vec3(5, 10);
                // 使用初始化列表(C++11)
                std::vector vec4 = {1, 2, 3, 4, 5};
                // 从数组创建vector
                int arr[] = {1, 2, 3, 4, 5};
                std::vector vec5(arr, arr + 5);
                // 从另一个vector创建
                std::vector vec6(vec5);

                这就像不同的方式开party:可以先空着等人来(vec1),可以先邀请5个人(vec2),可以先邀请5个特定的朋友(vec3)...

                添加和删除元素

                std::vector vec;
                // 在尾部添加元素
                vec.push_back(10);  // 添加元素10到尾部
                // 在指定位置插入元素
                vec.insert(vec.begin() + 1, 20);  // 在第二个位置插入20
                // 删除尾部元素
                vec.pop_back();
                // 删除指定位置的元素
                vec.erase(vec.begin() + 1);  // 删除第二个元素
                // 清空所有元素
                vec.clear();

                想象一下排队买票:

                • push_back是有人来排队,自动站到队尾
                  • insert是有人插队到指定位置
                    • pop_back是最后一个人不想排了,离开了
                      • erase是队伍中间某个人离开了
                        • clear是突然下大雨,所有人都散了

                          访问元素

                          std::vector vec = {10, 20, 30, 40, 50};
                          // 使用索引访问
                          int a = vec[2];  // 获取索引为2的元素(30)
                          // 使用at函数(带边界检查)
                          int b = vec.at(3);  // 获取索引为3的元素(40),越界会抛出异常
                          // 获取第一个和最后一个元素
                          int first = vec.front();  // 获取第一个元素(10)
                          int last = vec.back();    // 获取最后一个元素(50)

                          这就像找教室里的同学:直接叫号(索引)、点名确认(at)、找第一个和最后一个。

                          三、vector的容量管理

                          理解vector的容量管理是掌握其高效使用的关键。

                          size与capacity

                          • size:当前vector中实际元素的个数
                            • capacity:当前vector在不扩容的情况下最多能容纳的元素个数
                              std::vector vec;
                              for(int i = 0; i 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码