为什么list容器不能用下标引用

zhulinjia 2008-07-05 10:45:15
为什么list容器不能用下标引用
...全文
773 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2008-07-06
  • 打赏
  • 举报
回复
都没说到点子上。
下标索引要求常数时间的复杂度(语意上是这样)。随机访问list元素是达不到常数时间的。
要说连续存储,deque也不是连续存储的。
GoAssemblyNow 2008-07-06
  • 打赏
  • 举报
回复
4楼正解!
GoAssemblyNow 2008-07-06
  • 打赏
  • 举报
回复
可以啊,自己写个重载[]的函数;
  • 打赏
  • 举报
回复
list是链表,链表不是顺序存储的!
K行天下 2008-07-05
  • 打赏
  • 举报
回复
这个你可以和 数组 链表的关系联想

vector类似数组
list类似链表
  • 打赏
  • 举报
回复
因为List不是连续的。
zhangjundriver 2008-07-05
  • 打赏
  • 举报
回复
vector里面的元素是线性连续存储的,而list不是现行连续存储,而呀通过下标来访问里面的元素,则必须其元素的地址必须是能通过下标来直接计算的线性存储,
visame 2008-07-05
  • 打赏
  • 举报
回复
你可以这样来记:

vector相当于数组
list相当于链表
两者都是线性表
Cpp权哥 2008-07-05
  • 打赏
  • 举报
回复
刚才的代码第二个函数中的iterator忘记加const了,更正一下,抱歉。
#include <list>
namespace std{
template <typename T, typename A=allocator<T> >
class ilist : public list<T,A>
{
public:
T& operator[](int idx){
iterator it=begin();
for(int i=0; i<idx; i++)
++it;
return *it;
}
const T& operator[](int idx)const{
const_iterator it=begin();
for(int i=0; i<idx; i++)
++it;
return *it;
}
};
}
Cpp权哥 2008-07-05
  • 打赏
  • 举报
回复
由于list采用的是链接存储而不是连续存储,所以本质上它不支持下标方式(也就是按偏移量)访问。
如果确实需要,你可以自己来实现。只要在你的程序中加上下面的代码,这样就会得到一种跟list完全兼容的新容器ilist,不同的是它支持下标引用。

#include <list>
namespace std{
template <typename T, typename A=allocator<T> >
class ilist : public list<T,A>
{
public:
T& operator[](int idx){
iterator it=begin();
for(int i=0; i<idx; i++)
++it;
return *it;
}
const T& operator[](int idx)const{
iterator it=begin();
for(int i=0; i<idx; i++)
++it;
return *it;
}
};
}

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧