Vector容器简介

深入理解C++中的Vector容器

在C++的标准模板库(STL)中,vector是一个非常常用的容器,它提供了一种动态数组的实现,允许快速地随机访问元素,并在尾部进行高效地插入和删除操作。本文将深入探讨vector容器的特性、优点、缺点以及使用方法。

1. Vector容器的特性
  • 动态数组: vector是一个动态数组,可以根据需要动态地增长或缩小其大小,而不需要手动管理内存。
  • 连续存储: vector中的元素在内存中是连续存储的,这使得随机访问非常高效。
  • 随机访问: vector支持通过下标进行快速的随机访问,时间复杂度为O(1)。
  • 尾部插入/删除: 在vector的尾部进行元素的插入和删除操作非常高效,时间复杂度为O(1)。
  • 中间插入/删除: 在vector的中间插入或删除元素的操作比较低效,需要移动后续元素,时间复杂度为O(n)。
  • 动态扩容: 当vector的容量不足以容纳新的元素时,它会自动重新分配内存,并将所有元素拷贝到新的内存空间中。
2. Vector容器的优点
  • 高效的随机访问: vector支持常数时间复杂度的随机访问,适用于需要频繁访问元素的场景。
  • 尾部插入/删除高效: 在vector的尾部进行插入和删除操作非常高效,适用于需要频繁进行这些操作的场景。
  • 使用简单: vector提供了直观的接口和简单的语法,易于学习和使用。
3. Vector容器的缺点
  • 中间插入/删除低效: 在vector的中间插入或删除元素的操作比较低效,因为需要移动后续元素,不适用于频繁进行这些操作的场景。
  • 动态扩容开销: 当vector需要动态扩容时,会导致重新分配内存和拷贝元素的开销,可能会影响性能。
  • 不适合大规模插入/删除: 如果需要频繁在容器的中间进行大规模的插入或删除操作,vector可能不是最佳选择。
4. 使用Vector容器的方法

使用vector容器非常简单,只需要包含头文件<vector>,然后通过创建vector对象并调用其成员函数来进行操作。以下是一些常见的操作方法:

  • 创建vector: 使用vector的构造函数或赋值运算符来创建一个vector对象。
  • 插入元素: 使用push_back()函数在vector的尾部插入元素。
  • 访问元素: 使用下标操作符[]at()函数来访问vector中的元素。
  • 遍历元素: 使用迭代器或范围循环来遍历vector中的元素。
  • 删除元素: 使用pop_back()函数删除尾部元素,使用erase()函数删除指定位置的元素。
结论

vector容器是C++中非常常用的动态数组实现,它提供了高效的随机访问、尾部插入/删除等特性,适用于许多不同的场景。但是,在进行大规模中间插入/删除操作时,需要注意性能开销。综上所述,了解vector容器的特性和使用方法,可以帮助我们更好地利用它来解决问题。

Vector成员函数注释
  • push_back(): 在vector的尾部插入一个元素。
  • pop_back(): 删除vector的尾部元素。
  • size(): 返回vector中元素的数量。
  • empty(): 检查vector是否为空。
  • clear(): 清空vector中的所有元素。
  • begin(): 返回指向第一个元素的迭代器。
  • end(): 返回指向最后一个元素的下一个位置的迭代器。
  • resize(): 改变vector的大小。
  • reserve(): 预留一定的空间以存储元素,而不实际添加元素。
  • #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <numeric>
    
    int main() {
        // 创建一个vector并初始化
        std::vector<int> vec = { 5, 2, 8, 3, 1, 6 };
    
        // 打印vector中的元素
        std::cout << "Vector elements: ";
        for (int num : vec) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    
        // 使用迭代器遍历vector并打印元素
        std::cout << "Vector elements: ";
        for (auto it = vec.begin(); it != vec.end(); ++it) {
            std::cout << *it << " ";
        }
        std::cout << std::endl;
    
        // 使用算法对vector进行操作
    
        // 1. 排序算法(从小到大)
        std::sort(vec.begin(), vec.end());
        std::cout << "Sorted vector elements: ";
        for (int num : vec) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    
        // 2. 查找算法(返回值为下标)
        int target = 3;
        auto it = std::find(vec.begin(), vec.end(), target);
        if (it != vec.end()) {
            std::cout << "Element " << target << " found at index " << std::distance(vec.begin(), it) << std::endl;
        }
        else {
            std::cout << "Element " << target << " not found in vector" << std::endl;
        }
    
        // 3. 算法返回值(容器中元素之和)
        int sum = std::accumulate(vec.begin(), vec.end(), 0);
        std::cout << "Sum of vector elements: " << sum << std::endl;
    
        // 4. 遍历算法(倒序)
        std::cout << "Vector elements (reverse order): ";
        std::for_each(vec.rbegin(), vec.rend(), [](int num) {
            std::cout << num << " ";
            });
        std::cout << std::endl;
    
        // 5. 变换算法(容器中的元素都乘以2)
        std::vector<int> doubled_vec;
        std::transform(vec.begin(), vec.end(), std::back_inserter(doubled_vec), [](int num) {
            return num * 2;
            });
        std::cout << "Vector elements (doubled): ";
        for (int num : doubled_vec) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    
        // 添加元素
    
        // 在头部插入元素
        vec.insert(vec.begin(), 10);
    
        // 在中间位置插入元素
        vec.insert(vec.begin() + 3, 20);
    
        // 在尾部插入元素
        vec.push_back(30);
    
        std::cout << "Vector after inserting elements: ";
        for (int num : vec) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    
        // 删除元素
    
        // 删除头部元素
        vec.erase(vec.begin());
    
        // 删除中间位置元素
        vec.erase(vec.begin() + 3);
    
        // 删除尾部元素
        vec.pop_back();
    
        std::cout << "Vector after deleting elements: ";
        for (int num : vec) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    
        return 0;
    }
    

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值