当前位置: 首页 > article >正文

【C++】Vector

C++中的vector是一种动态数组,它可以根据需要动态地调整大小,同时还提供了许多实用的函数,使其非常适合用于存储和操作元素的集合。本文将介绍C++中的vector的基本概念、使用方法和常见应用场景。

一、基本概念

vector是C++ STL库中的一个容器,它可以存储任意类型的元素。vector使用连续的内存块存储元素,因此可以通过下标访问元素,具有类似数组的特性。与数组不同的是,vector可以动态地调整大小,因此可以根据需要添加或删除元素。

vector的声明格式如下:

 

arduinoCopy code

vector<数据类型> 变量名;

例如,声明一个存储int类型元素的vector:

 

arduinoCopy code

vector<int> v;

二、使用方法

  1. 添加元素

可以使用push_back函数向vector中添加元素:

 

scssCopy code

v.push_back(1); //添加一个整数1到vector中 v.push_back(2); //添加一个整数2到vector中

  1. 访问元素

可以使用下标访问vector中的元素:

 

cCopy code

cout << v[0] << endl; //输出vector中第一个元素的值

也可以使用at函数访问vector中的元素:

 

cCopy code

cout << v.at(1) << endl; //输出vector中第二个元素的值

需要注意的是,使用下标访问vector时,如果下标越界会导致程序崩溃,因此建议使用at函数访问元素。

  1. 删除元素可以使用pop_back函数删除vector中的最后一个元素:

v.pop_back(); //删除vector中最后一个元素

也可以使用erase函数删除指定位置的元素:

v.erase(v.begin()+1); //删除vector中第二个元素

需要注意的是,使用erase函数删除元素后,vector的大小会发生变化。

  1. 获取vector的大小;

可以使用size函数获取vector中元素的个数:

cout << v.size() << endl; //输出vector中元素的个数

  1. 遍历vector

可以使用for循环遍历vector中的元素:

for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; //输出vector中的元素 } cout << endl;

也可以使用迭代器遍历vector中的元素:

for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; //输出vector中的元素 } cout << endl;

需要注意的是,使用迭代器遍历vector时,不要越界。

三、常见应用场景

  1. 保存和操作一组元素


    vector可以用于保存一组元素,并且可以方便地添加、删除和访问元素。

     
  2. 保存动态大小的数据
  3. 由于vector可以动态调整大小,因此可以用于保存动态大小的数据,例如读入未知数量的数据时可以使用vector保存。

  4. 实现栈和队列
  5. 由于vector具有类似数组的特性,因此可以用于实现栈和队列等数据结构。

  6. 实现算法
  7. vector可以用于实现各种算法,例如排序、查找、去重等,可以大大简化算法实现的过程。

    四、总结

    vector是C++中非常实用的容器,具有动态调整大小、方便访问元素、简化算法实现等优点,因此在编写C++程序时经常会用到。需要注意的是,使用vector时需要注意下标越界和迭代器越界的问题,以避免程序崩溃。

Vector 跟List 使用earse的区别

在 C++ 中,std::vectorstd::list 是两种常见的容器类型,它们都提供了 erase 方法来删除容器中的元素,但二者在使用 erase 方法时有一些区别。

  1. 实现方式不同:std::vector 是基于动态数组实现的容器,而 std::list 是基于双向链表实现的容器。因此,它们在 erase 操作的实现方式上有所不同。

  2. 时间复杂度不同:std::vectorerase 方法的时间复杂度是 O(n),其中 n 是容器的大小,因为它需要将删除点后面的元素向前移动,以填补删除的空缺;而 std::listerase 方法的时间复杂度是 O(1),因为它只需要修改相邻节点的指针即可。

  3. 支持随机访问:std::vector 支持随机访问,即可以通过下标访问容器中的元素;而 std::list 不支持随机访问,因为它的元素并不是连续存储的。

  4. 补充:vector、deque底层都是用了连续空间,所以虽然++iter迭代器了,但是erase(tempit)以后底层是连续空间,删除会挪动数据,最终导致iter意义变了,已失效了。

    而list,不是连续空间,删除以后tempIt虽然失效了,但是不影响iter。

综上所述,如果需要删除一个元素后继续遍历容器,或者需要频繁进行插入和删除操作,建议使用 std::list;如果需要支持随机访问、对容器进行排序等操作,建议使用 std::vector


http://www.kler.cn/news/10364.html

相关文章:

  • 软件测试培训
  • JUC源码系列-AQS的Condition的接口实现
  • 程序员在职场中如何让自己的技能快速提高,WEB前端开发工程师如何让自己快速成为团队的核心开发人员?
  • Follow My Heart Of Apirl. 2023
  • LAZADA平台开放接口的接入和参数说明(目前支持以下基本接口:item_get 获得淘宝商品详情item_search 获得淘宝商品详情)
  • 为何ChatGPT如此擅长编造故事?
  • 操作系统 - 学习笔记
  • 不一样的websocket封装简洁版
  • 设计模式之迭代器模式(C++)
  • 新品国产C2000,独立双核32位CPU,主频高达400MHz,QX320F280049
  • 数据分析-统计基础
  • 29岁,普通功能测试,我是如何在一周内拿到5份Offer的?
  • Linux 内存回收,思维导图记录
  • CMake项目使用ctest+gtest进行单元测试
  • Vulnhub:Digitalworld.local (Development)靶机
  • C++ 23 实用工具(二)绑定工具
  • 10.字符串
  • 学习机器人SLAM导航核心技术(一)
  • 网络之广播域和冲突域
  • Qt5.12实战之规则DLL导出函数使用
  • 什么是分布式锁
  • 软考第二章 数据通信基础
  • 写博客8年与人生第一个502万
  • 空间复杂度
  • Makefile第十课:Makefile编译
  • 当你觉得生活快熬不下去时,请你读一读《活着》
  • Elastic Enterprise Search 8.7:新连接器、网络爬虫提取规则和搜索分析客户端测试版
  • Golang数据类型比较
  • MongoDB
  • 使用 ArcGIS Pro 进行土地利用分类的机器学习和深度学习