STL 的两个疑问?望高手指点!

tserpent 2003-08-30 08:23:28
1. stl 中的 list,感觉不怎么名副其实,一般的链表可以根据某个元素得到它的后续元素,这是链表的特征,但是stl list好像没这种功能。

2. stl 中的遍历是靠iterator来实现的,但是如果我要删除list,vector or map中的某些满足一定条件的元素,当我用iterator找到某个元素时,我可以用erase它,但是问题时这时iterator就会失效,也就说我不能再继续遍历下去,而得从头再来,这样非常不合理。

不知道我的理解和用法对不对,大家指点一下。
...全文
29 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xghost 2003-08-30
  • 打赏
  • 举报
回复
up
积木 2003-08-30
  • 打赏
  • 举报
回复
struct __list_node
{
__link_type next;
__link_type prev;
T data;
};
继续看这个东西,既然你都知道了list_node的一个指针,你就可以直接操作next和prev了你知道吗?在list类层次中你是不能直接访问list_node的成员的,因为list_node本身就是保护的,你只能通过迭代器来操作,但是你侥幸得到了list_node的指针,你就可以直接操作了
积木 2003-08-30
  • 打赏
  • 举报
回复
之所以没有想传统链表那样定义list是因为class的数据封装性
class就是要通过函数接口来操作数据,而不是想以前那样直接操作数据
积木 2003-08-30
  • 打赏
  • 举报
回复
1. stl 中的 list,感觉不怎么名副其实,一般的链表可以根据某个元素得到它的后续元素,这是链表的特征,但是stl list好像没这种功能。

但是list还是实现了只能在两端插入,你要求的是形似还是本质上一样呢?
list的实现代码就是链表的。它的find实现也只能是O(n)的,给你一个声明

struct __list_node
{
__link_type next;
__link_type prev;
T data;
};
template <class T, class Allocator _RWSTD_COMPLEX_DEFAULT(allocator<T>) >
class list
{
protected:
struct __list_node;
struct __list_node_buffer;
friend struct __list_node;
friend struct __list_node_buffer;
}
这个就是list的声明代码(节选),看到 __link_type next; __link_type prev;了吧
这个就是链表最明显的标志

2. stl 中的遍历是靠iterator来实现的,但是如果我要删除list,vector or map中的某些满足一定条件的元素,当我用iterator找到某个元素时,我可以用erase它,但是问题时这时iterator就会失效,也就说我不能再继续遍历下去,而得从头再来,这样非常不合理。

这句话说明你对STL的有一定的理解,但是很不完全
原来你用指针遍历的时候,当你删除一些元素时,原来的指针指向的地址你还敢用吗?
事实上是你不敢,对吧,那么为什么你希望STL要这么做呢?迭代器的出现并不是想改变
原来的编程逻辑,而是希望你写的代码更加的标准,更加的高效,如果你什么东西都靠
STL,那就不要用STL了,就想是赋值这种事情
btw:有一些erase总是返回被删除元素的下一个迭代器,
IT_worker 2003-08-30
  • 打赏
  • 举报
回复
2:list规定某iterator被erase之后,仍然可以通过此iterator得到下一个和前一个iterator,如果再次有iterator被erase,原iterator可能失效。
yjh1982 2003-08-30
  • 打赏
  • 举报
回复
1,list 是用iterator得到后面的元素
2,用template<class Predicate>
void remove_if(
Predicate _Pred
)
方法删元素, Predicate是一个谓词函数,满足删除条件返回true
tserpent 2003-08-30
  • 打赏
  • 举报
回复
1. 对于list,举个例子,list<CClass*>, 已知list中的一个元素CClass* pClass, 但是我不知道它iterator位置,这种情况下,就没有办法得到pClass的next,或者prev了。

2. 多谢,goodboy1881(三井) 看来对erase有些误解,有一些erase总是返回被删除元素的下一个迭代器,我得的做法总是又把它指到begin().

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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