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

 更新时间:2022年01月07日 11:55:30   作者:紫荆鱼  
对于学c语言的同学来说,vector和list这两个东西经常会搞错,下面这篇文章主要给大家介绍了关于C++中vector和list区别的相关资料,需要的朋友可以参考下

一张表格让你理解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区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++多线程为何要使用条件变量详解

    c++多线程为何要使用条件变量详解

    多线程是多任务处理的一种特殊形式,下面这篇文章主要给大家介绍了关于c++多线程为何要使用条件变量的相关资料,需要的朋友可以参考下
    2021-06-06
  • 基于C语言编写一个多功能计算器

    基于C语言编写一个多功能计算器

    这篇文章主要为大家详细介绍了如何基于C语言编写一个多功能计算器,除了四则混合运算之外,还支持三角函数和绝对值等函数,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • C++缺省参数的具体使用

    C++缺省参数的具体使用

    缺省参数是声明或定义函数时为函数的参数指定一个默认值。本文就详细的介绍了一下C++缺省参数的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2022-01-01
  • C++中文件操作基础详解

    C++中文件操作基础详解

    这篇文章主要为大家详细介绍了C++中的一些文件操作基础详解,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
    2022-06-06
  • C/C++中虚基类详解及其作用介绍

    C/C++中虚基类详解及其作用介绍

    这篇文章主要介绍了C/C++中虚基类的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++设置系统时间及系统时间网络更新的方法

    C++设置系统时间及系统时间网络更新的方法

    这篇文章主要介绍了C++设置系统时间及系统时间网络更新的方法,涉及网络程序设计与系统函数的使用,需要的朋友可以参考下
    2014-10-10
  • C语言数组超详细讲解下篇扫雷

    C语言数组超详细讲解下篇扫雷

    数组是一组有序的数据的集合,本篇将带你结合数组来实现扫雷小游戏,上手实练更快的能够掌握数组使用,感兴趣的朋友来看看吧
    2022-04-04
  • C/C++实现crc码计算和校验

    C/C++实现crc码计算和校验

    循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术。本文主要介绍了C++实现crc码计算和校验的方法,需要的可以参考一下
    2023-03-03
  • Matlab实现绘制立体玫瑰花的示例代码

    Matlab实现绘制立体玫瑰花的示例代码

    这篇文章主要介绍了如何利用Matlab实现绘制更立体的玫瑰花,文中的示例代码讲解详细,对我们学习Matlab有一定的帮助,需要的可以参考一下
    2023-02-02
  • C语言实现代码雨效果

    C语言实现代码雨效果

    这篇文章主要为大家详细介绍了C语言实现代码雨效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论