• C++ 入门14:STL 容器之向量(vector)


    往期回顾:

    C++ 入门11:虚函数和多态-CSDN博客

    C++ 入门12:模板(Template)-CSDN博客

    C++ 入门13:异常处理-CSDN博客


    C++ 入门14:STL 容器之向量(vector) 

    一、前言

    在前面文章的学习中,我们学习了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员、运算符重载、友元函数、友元类、继承和派生类、虚函数和多态、模板以及异常处理。今天,我们将学习 C++ 标准模板库(STL)中的一种重要容器——向量(vector)。向量是一种动态数组,可以方便地进行元素的添加和删除操作。这是STL里非常常用的一种,需要好好掌握。

    二、STL 容器之向量(vector)

    2.1、 什么是向量?

    向量(Vector)是C++标准模板库(Standard Template Library, STL)中一个非常核心且广泛使用的容器类。它提供了一种能够存储同一类型元素的动态数组的实现。

    向量在底层通常是通过一个连续的内存块来存储元素,但与传统的静态数组不同,向量的大小(即它能存储的元素数量)是可以动态变化的。这意味着,随着程序运行的需要,向量可以自动地增加其容量以容纳更多的元素,或者减少其占用的内存空间(尽管减少容量通常不会自动发生,除非通过特定的成员函数如shrink_to_fit来请求)。

    2.2、向量的主要特点

    1. 动态数组:向量提供了类似数组的顺序访问功能,但允许在运行时动态地改变其大小。这意味着你可以像使用数组一样通过索引来访问向量中的元素,但无需在编译时指定数组的大小。

    2. 自动内存管理:当你向向量中添加元素时,如果当前分配的存储空间不足以容纳新元素,向量会自动重新分配一块更大的内存区域,并将现有元素以及新元素复制到新的内存位置。同样,当元素被移除时,虽然向量的实际大小会减小,但底层内存不会自动减少,除非特别请求。

    3. 提供丰富的成员函数:向量提供了许多成员函数来支持各种操作,如push_back用于在向量末尾添加一个元素,pop_back用于移除向量末尾的元素,size返回当前向量的元素个数,capacity返回当前向量分配的存储空间大小等。

    4. 高效访问:由于向量在内存中连续存储元素,因此通过索引访问向量中的元素是非常高效的,时间复杂度为O(1)。

    5. 模板支持:向量是模板类,因此它可以存储任何类型的元素。你只需在声明向量时指定元素的类型即可。

    2.3、向量的使用场景

    1、当需要存储一个元素集合,并且这个集合的大小可能会在运行时改变时。

    2、当需要频繁访问集合中的元素,且对访问速度有较高要求时(因为向量提供了高效的随机访问)。
    3、当想要自动管理内存,避免手动处理动态数组时可能遇到的内存泄漏等问题。

    2.4、向量的基本操作

    (1)引入头文件

    在使用向量之前,需要引入头文件

    #include 
    

    (2)创建向量

    我们可以使用不同的方式来创建向量。

    1. #include <iostream>
    2. #include <vector>
    3. using namespace std;
    4. int main() {
    5. vector<int> vec1; // 创建一个空的向量
    6. vector<int> vec2(10); // 创建一个包含10个元素的向量,每个元素的值为0
    7. vector<int> vec3(10, 5); // 创建一个包含10个元素的向量,每个元素的值为5
    8. vector<int> vec4 = {1, 2, 3, 4, 5}; // 使用列表初始化向量
    9. return 0;
    10. }

    2.5、向量的常用成员函数

    (1)添加元素

    使用 push_back 函数在向量的末尾添加元素。

    1. vector<int> vec;
    2. vec.push_back(10);
    3. vec.push_back(20);
    4. vec.push_back(30);

    (2)访问元素

    使用 at 函数或下标运算符 [] 访问向量中的元素。

    1. cout << "Element at index 0: " << vec.at(0) << endl;
    2. cout << "Element at index 1: " << vec[1] << endl;

    (3)修改元素

    直接使用下标运算符 [] 修改向量中的元素。

    1. vec[0] = 100;
    2. cout << "Modified element at index 0: " << vec[0] << endl;

    (4)删除元素

    使用 pop_back 函数删除向量末尾的元素。

    1. vec.pop_back();
    2. cout << "After pop_back, size of vec: " << vec.size() << endl;

    (5)获取向量的大小

    使用 size 函数获取向量中的元素个数。        

    cout << "Size of vec: " << vec.size() << endl;
    

    (6)检查向量是否为空

    使用 empty 函数检查向量是否为空。

    1. if (vec.empty()) {
    2. cout << "vec is empty" << endl;
    3. } else {
    4. cout << "vec is not empty" << endl;
    5. }

    2.6、 向量的迭代器

    向量提供了一种灵活的方式来访问其元素——迭代器。迭代器是一种对象,它可以用来遍历容器中的元素。

    (1)获取迭代器

    使用 begin 函数获取指向向量第一个元素的迭代器,使用 end 函数获取指向向量最后一个元素的下一个位置的迭代器。

    1. vector<int> vec = {10, 20, 30, 40, 50};
    2. // 使用迭代器遍历向量
    3. for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    4. cout << "Element: " << *it << endl;
    5. }

    (2)使用范围循环

    C++11 引入了范围循环,可以更简洁地遍历向量。

    1. for (int val : vec) {
    2. cout << "Element: " << val << endl;
    3. }

    2.7、 向量的高级操作

    (1)插入元素

    使用 insert 函数在向量的指定位置插入元素。

    1. vector<int> vec = {10, 20, 30};
    2. vec.insert(vec.begin() + 1, 15); // 在第二个位置插入15
    3. for (int val : vec) {
    4. cout << "Element: " << val << endl;
    5. }

    (2)清空向量

    使用 clear 函数清空向量中的所有元素。

    1. vector<int> vec = {10, 20, 30, 40, 50};
    2. vec.clear(); // 清空向量
    3. cout << "After clear, size of vec: " << vec.size() << endl;

    2.8、向量与动态数组的区别

    向量和动态数组(如 new[] 分配的数组)有一些相似之处,但也有重要的区别:

    自动管理内存

    向量会自动管理内存,当向量大小增加时,会自动分配更多的内存。而动态数组需要手动管理内存。
    方便的操作向量提供了丰富的成员函数,如 push_backinserterase 等,而动态数组需要手动实现这些操作。
    安全性向量提供边界检查,如 at 函数可以抛出异常,而动态数组没有边界检查,可能导致未定义行为。

    以上就是 C++ 标准模板库中的向量(vector)的基础知识点了。包括向量的基本操作、迭代器的使用以及一些高级操作。向量是 C++ 中非常常用的一种容器,它提供了动态调整大小的功能,非常适合需要频繁修改大小的场景。基本上在开发中都会用到的,大家多看看,一定要掌握。

    都看到这里了,点个赞再走呗朋友~

    加油吧,预祝大家变得更强!

  • 相关阅读:
    LeetCode Cookbook 字符串习题 上篇
    第5次作业练习题(第五章:总线与接口、中断、DMA)
    使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)
    九章云极DataCanvas大模型系列成果发布会重磅来袭,诚邀见证!
    算法总结-栈和队列
    你知道如何科学的学习吗?-关于个人成长的思考
    分享给自媒体人:做自媒体最好的心态
    归并排序— —递归、非递归实现【十大经典排序算法】
    Config配置刷新
    6年测试被裁,突袭3个月27K上岸华为,面试居然这样....
  • 原文地址:https://blog.csdn.net/LF__plus/article/details/140449825