C++面试题:list和vector有什么区别?
原文:http://genwoxuevc.blog.51cto.com/1852984/503337
C++面试题:list和vector有什么区别?
考点:理解list和vector的区别
出现频率:★★★★
解析:
vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取(即使用[]操作符访问其中的元素),但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝(复杂度是O(n)),另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。
list是由数据结构中的双向链表实现的,因此它的内存空间可以是不连续的。因此只能通过指针来进行数据的访问,这个特点使得它的随机存取变的非常没有效率,需要遍历中间的元素,搜索复杂度O(n),因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
由于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++面试题:list和vector有什么区别?的更多相关文章
- C++面试题:list和vector有什么区别
C++面试题:list和vector有什么区别?考点:理解list和vector的区别出现频率:★★★★解析:vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随 ...
- JDK源码看ArrayList和Vector的一些区别
最近在看JDK源码,从源码的角度记录一下ArrayList和Vector的一些区别 1.new a.不指定长度 Vector默认创建10个元素的数组 public Vector() { this(10 ...
- Vector 和 ArrayList 区别
1.Vector是多线程安全的,而ArrayList不是,如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些:Vector是旧的,是java一诞生就提供了的 ...
- vector与list区别
vector为存储的对象分配一块连续的地址空间,因此对vector中的元素随机访问效率很高.在vecotor中插入或者删除某个元素,需要将现有元素进行复制,移动.如果vector中存储的对象很大,或者 ...
- Set,List,Map,Vector,ArrayList的区别(转)
JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtab ...
- vector与set区别(基础知识)
首先,vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入 ...
- c++ list, vector, map, set 区别与用法比较
http://blog.csdn.net/alex_xhl/article/details/37692297 List封装了链表,Vector封装了数组, list和vector得最主要的区别在于ve ...
- vector.resize 与 vector.reserve的区别 .xml
pre{ line-height:1; color:#9f1d66; background-color:#a0ffc0; font-size:16px;}.sysFunc{color:#5d57ff; ...
- vector 与 set区别
注:本文内容摘自网络,准确性有待验证,现阶段仅供学习参考.尊重作品作者成果,原文链接 :http://blog.csdn.net/wxdcxp/article/details/5279618 首先,v ...
随机推荐
- 关于Ext.NET Demo程序在IIS7.5部署出现"Ext未定义"的解决方案
有以下三点 1.应用程序池请用ASP.NET4.0经典模式 2.安装ASP.NET 控制面板-->程序和功能-->打开或关闭WIndows功能-->Internet信息服务--& ...
- Azure中国版 制作镜像 捕捉镜像
因为项目需要需要部署多台功能一样的服务器,简单来说是多台nginx服务器.如果按照原始的做法,是新建vm,然后一台台部署相关服务. 现在Azrue已经可以通过捕获镜像的方式创建vm镜像模板,然后按照创 ...
- 开发资源列表【Worldsing分享】
ucGUI(emWin)类: ucGui 汉字库生成(汉字库提取工具):ucGuiFont点击下载 ucGui v3.98 VC模拟工程源代码(VS2008):ucGUI3.98 VS2008 点 ...
- 【Oracle 函数索引】一次数据库的优化过程
[问题]表里数据2万条,查询执行时间 818087.38 ms(12分钟). SQL语句如下:select F1,F2,F3,F4 from t_sms_g_send t left joi ...
- 在CentOS 5.8上搭建PPTP VPN服务
在天朝上网,vpn已经是必备之物了,我也记录一下搭建vpn服务的方法. 1. 确认内核是否支持MPPE模块MPPE用来支持Microsoft Point to Point Encryption, 包括 ...
- ASP.NET设置404页面返回302HTTP状态码的解决方法
在配置文件中配置404页面如下: .代码如下: <customErrors mode="On" defaultRedirect="404.aspx"> ...
- ActiveMQ讯息传送机制以及ACK机制详解
[http://www.ylzx8.cn/ruanjiangongcheng/software-architecture-design/11922.html] AcitveMQ:消息存储和分发组件,涉 ...
- MySQL事务处理和锁机制
事务处理和并发性 1.1 基础知识和相关概念 1 )全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置的事务功能. 2 )使用 begin 开始事务,使用 commit 结束事务, ...
- SQLServer获取随机数据
1.比较常见和好用的一种 SELECT TOP 10 *, NEWID() AS randomFROM tableORDER BY random --newid函数会随机生成一个guid,很长的一个字 ...
- [转]在Arcmap中加载互联网地图资源的4种方法
转自http://blog.3snews.net/space.php?uid=6955280&do=blog&id=67981 前一段时间想在Arcmap中打开互联网地图中的地图数据, ...