返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一篇文章让你轻松理解C++中vector和list区别
  • 745
分享到

一篇文章让你轻松理解C++中vector和list区别

2024-04-02 19:04:59 745人浏览 八月长安
摘要

目录一张表格让你理解vector和list区别例子总结一张表格让你理解vector和list区别 区别vectorlist数据结构:顺序表(动态数组)环形双向链表物理空间:连续的非连

一张表格让你理解vector和list区别

区别vectorlist
数据结构顺序表(动态数组环形双向链表
物理空间:连续的非连续的
内存消耗:
大小可变:可变-动态数组可变-通过指针
随机存储:支持(vector 重载了[])不支持(因为非连续)
优势:支持随机存储任意节点高效的插入、删除等操作
劣势:插入和删除进行内存拷贝工作不支持随机存取

?数据结构对比图:

?那我们怎样选择使用vector和list呢?

在选择该用哪种数据结构的时候,应该遵循这样的原则:

1. 如果只关心随机存取,不在乎插入和删除 ,那么就要考虑vector

2. 如果只关心插入删除,不在意随机存取, 那么就要考虑list

例子

处理大量数据时,数据相对固定,不关心排序和中间值插入和删除,只是进行查询和筛选时,选vector。

处理顺序发生改变的数据时,数据变化,比如排行榜需要进行换位,插入删除等操作,此时选择list。

由于list和vector上面的这些区别,因此list::iterator与vector::iterator也有一些不同。请看下面的例子:

        #include <iOStream>
        #include <vector>
        #include <list>
        using namespace std;
        
        int main( void )
        {
                vector<int> v; 
                list<int> l;
                
                for (int i=0; i<8; i++)     //往v和l中分别添加元素
                {
                        v.push_back(i);
                        l.push_back(i);
                }
                
                cout << "v[2] = " << v[2] << endl;
                //cout << "l[2] = " << l[2] << endl;       //编译错误,list没有重载[]
                cout << (v.begin() < v.end()) << endl;
                //cout << (l.begin() < l.end()) << endl;   //编译错误,list::iterator没有重载<或>
                cout << *(v.begin() + 1) << endl;
                
                vector<int>::iterator itv = v.begin();
                list<int>::iterator itl = l.begin();
                itv = itv + 2;
                //itl = itl + 2;                  //编译错误,list::iterator没有重载+
                itl++;itl++;                    //list::iterator中重载了++,只能使用++进行迭代访问。
                cout << *itv << endl;
                cout << *itl << endl;
        
                return 0;
        }

由于vector拥有一段连续的内存空间,能非常好的支持随机存取,因此vector<int>::iterator支持“+”、“+=”、“<”等操作符。

而list的内存空间可以是不连续,它不支持随机访问,因此list<int>::iterator则不支持“+”、“+=”、“<”等操作符运算,因此代码20、26行会有编译错误。只能使用“++”进行迭代,例如代码27行,使用两次itl++来移动itl。还有list也不支持[]运算符,因此代码18行出现编译错误。

总之,如果需要高效的随即存取,而不在乎插入和删除的效率,使用vector;如果需要大量的插入和删除,而不关心随即存取,则应使用list。

答案:

vector拥有一段连续的内存空间,因此支持随机存取,如果需要高效的随即存取,而不在乎插入和删除的效率,使用vector。

list拥有一段不连续的内存空间,因此支持随机存取,如果需要大量的插入和删除,而不关心随即存取,则应使用list。

总结

到此这篇关于c++中vector和list区别的文章就介绍到这了,更多相关C++中vector和list区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一篇文章让你轻松理解C++中vector和list区别

本文链接: https://lsjlt.com/news/161870.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一篇文章让你轻松理解C++中vector和list区别
    目录一张表格让你理解vector和list区别例子总结一张表格让你理解vector和list区别 区别vectorlist数据结构:顺序表(动态数组)环形双向链表物理空间:连续的非连...
    99+
    2024-04-02
  • 一篇文章带你了解C++(STL基础、Vector)
    目录STL基本概念STL六大组件STL中容器、算法、迭代器容器算法迭代器初识Vector容器Vector三大遍历算法Vector存放其他数据类型 Vector容器嵌套总结S...
    99+
    2024-04-02
  • 一篇文章让你轻松记住js的隐式转化
    目录前言一、包装类Boolean()扩展Number()引用类型转换Number原始类型转Number还有这些混淆点是需要注意的:扩展String()Object.prototype...
    99+
    2024-04-02
  • 一篇文章带你轻松搞懂Golang的error处理
    目录Golang中的errorerror的几种玩法哨兵错误自定义错误类型Wrap errorGolang1.13版本error的新特性errors.UnWrap()errors.Is...
    99+
    2024-04-02
  • 一篇文章弄懂Mybatis中#和$的区别
    目录前言一:下面我们写个关于“#”的个sql,看能不能注入。1.正常传参2.拼接传参二:下面我们写个关于“$”的个sql,看能不能注入。1.正常传参2.拼接传参总结前言 在学校的时候...
    99+
    2024-04-02
  • 一篇文章带你了解C++中的异常
    目录异常抛出异常基本操作自定义的异常类栈解旋异常接口声明异常变量的生命周期异常的多态c++的标准异常库编写自己的异常类总结异常 在c语言中,对错误的处理总是两种方法: 1,使用整型的...
    99+
    2024-04-02
  • 一篇文章了解c++中的new和delete
    目录new expressiondelete expressionnew[]和new()new[]和delete[]new的内存分布placement newnew失败处理捕捉异常禁...
    99+
    2024-04-02
  • 一篇文章带你了解C++中的显示转换
    目录总结命名的强制类型转换: 形式: cast-name<type>(expression); type是强制转换的类型,expression是强制转换的值。如果...
    99+
    2024-04-02
  • 一篇文章带你了解C++ static的作用,全局变量和局部变量的区别
    目录1.static的作用2.staic全局变量和局部变量的区别,存储位置?区别: 我们自底向上的方式进行讲解:总结1.static的作用 (1) 修饰局部变量时,只初始化一...
    99+
    2024-04-02
  • 一篇文章助你理解Python3中字符串编
    前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解Python2中字符串编码问题。下面在P...
    99+
    2023-01-31
    字符串 一篇文章
  • 一篇文章带你了解C++多态的实现原理
    目录虚函数和多态多态的作用多态的一个例子构造函数和析构函数中存在多态吗?多态的实现原理虚函数表虚析构函数纯虚函数和抽象类总结虚函数和多态 虚函数: 在类的定义中,前面有 v...
    99+
    2024-04-02
  • 一篇文章带你了解C语言中volatile关键字
    目录C语言中volatile关键字总结C语言中volatile关键字 volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多。 当不用这个关键字的时候,CP...
    99+
    2024-04-02
  • 一篇文章带你了解C++Primer学习日记--处理数据
    目录1.简单变量1.1变量名1.2整型short,int,long和long long1.3无符号类型1.4选择整型类型1.5char类型2.const限定符3.浮点类型4.类型转换...
    99+
    2024-04-02
  • 一篇文章带你从java字节码层理解i++和++i
    目录程序目的关键指令i++示例源码使用jclasslib查看i++字节码++i示例源码参考总结程序目的 从java字节码层理解,为何i = i++后,结果是+1之前的数值。而i=++...
    99+
    2024-04-02
  • 一篇文章让你彻底了解Java可重入锁和不可重入锁
    可重入锁  广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。 ...
    99+
    2024-04-02
  • 一文让你彻底弄懂js中undefined和null的区别
    目录前言一、基本概念1、undefined2、null二、简单区别三、表现形式1、typeof2、== 与 ===3、Object.prototype.toString.call4、...
    99+
    2024-04-02
  • 一篇文章带你了解python中的typing模块和类型注解
    目录typing模块DictListTupleset/AbstractSetSequenceNoReturnAnyTypeVarNewTypeCallableUnionOp...
    99+
    2024-04-02
  • 一篇文章带你了解论C语言中算法的重要性
    目录一、问题一(打印阶乘)问题描述:问题分析:解决方案:1.让我们检查一下结果,发现问题很有可能是循环的时候没有循环本身2.这里要引入C++中STL库的一个知识点二、问题二(比较多项...
    99+
    2024-04-02
  • 一篇文章带你理解Java Spring三级缓存和循环依赖
    目录一、什么是循环依赖?什么是三级缓存二、三级缓存如何解决循环依赖?三、使用二级缓存能不能解决循环依赖?总结一、什么是循环依赖?什么是三级缓存 【什么是循环依赖】什么是循环依赖很好理...
    99+
    2024-04-02
  • 一篇文章带你了解C语言文件操作中的几个函数
    目录总结fopen:有两个参数,第一个是要被打开或者被创建的文件名,第二个是以什么方式打开。这两个参数要分别用双引号括起来 打开文件和关闭文件的基本流程,关闭文件之后要置空 f...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作