[STL VS C]不知道这个算STL链表等数据结构中的一个效率硬伤不?

lin_style 2010-07-12 10:44:30
先来推一个论点:
STL中只是对链表对象的一个包装,因为对用户是透明的,所以给用户展示的还是原来的结构。那么就意味着,链表信息无法原来的结构体中取得,如果要进行增,删,改,则必须进行查询找到链表节点

假设有结构
struct page
{

list head; //如果是C,以linux下的链表使用方法为代表,直接将信息作为结构体的一个成员变量
};

接着将page串成链表
C中,list_add_tail(). C中是以数据结构和操作方法分开,典型的过程式写法
C++中,list<page*> List; List.push(); 类的思维写法,一个对象包括代码和数据

当我要进行删除的时候
void *p; //我的内存地址
pPage = virt_to_head_page(p); //反算出page
C中,list_del(pPage);//直接删除,因为本身就有结点信息
C++中,List.删除(pPage); //我的做法是,先find到itr,然后erase.如果是remove,好象是一个遍历


也可能是我list用得不对,还请大家指教
...全文
172 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin_style 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 akirya 的回复:]

引用 13 楼 healer_kx 的回复:

引用 12 楼 akirya 的回复:

C++也可以保存迭代器,需要的时候删除。。。


那好危险啊。。。

还好了
跟C保存解点数据,直接删除某节点一样的危险。
[/Quote]

但是C++的迭代器,接口信息就变了。C还是原来一样的接口类型。使用的感觉就不一样,所以说是个硬伤,也是2种语言使用起来不同的感觉
kingstarer 2010-07-12
  • 打赏
  • 举报
回复
list的迭代器好像是不会因为增删(不是删自己的情况)改失效吧
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 healer_kx 的回复:]

引用 12 楼 akirya 的回复:

C++也可以保存迭代器,需要的时候删除。。。


那好危险啊。。。
[/Quote]
还好了
跟C保存解点数据,直接删除某节点一样的危险。
lin_style 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fancymouse 的回复:]

list_del是一个封装的循环。本质还是遍历表然后删掉。
[/Quote]

static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
}


都有节点信息了,怎么可能还去遍历
FancyMouse 2010-07-12
  • 打赏
  • 举报
回复
list_del是一个封装的循环。本质还是遍历表然后删掉。
healer_kx 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 akirya 的回复:]

C++也可以保存迭代器,需要的时候删除。。。
[/Quote]

那好危险啊。。。
  • 打赏
  • 举报
回复
C++也可以保存迭代器,需要的时候删除。。。
lin_style 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 healer_kx 的回复:]

引用 9 楼 lin_style 的回复:

引用 8 楼 healer_kx 的回复:

引用 6 楼 lin_style 的回复:

分给30楼


好,画个圈圈诅咒你~


那给20楼


丢人。。。STL的东西就自己看呗~你都那么牛了。。。还问这种问题。。。
[/Quote]

用得少,不懂。。增加点发贴量。
healer_kx 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lin_style 的回复:]

引用 8 楼 healer_kx 的回复:

引用 6 楼 lin_style 的回复:

分给30楼


好,画个圈圈诅咒你~


那给20楼
[/Quote]

丢人。。。STL的东西就自己看呗~你都那么牛了。。。还问这种问题。。。
lin_style 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 healer_kx 的回复:]

引用 6 楼 lin_style 的回复:

分给30楼


好,画个圈圈诅咒你~
[/Quote]

那给20楼
healer_kx 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lin_style 的回复:]

分给30楼
[/Quote]

好,画个圈圈诅咒你~
pengzhixi 2010-07-12
  • 打赏
  • 举报
回复
C++中list只需要erase就可以了
lin_style 2010-07-12
  • 打赏
  • 举报
回复
分给30楼
Crob 2010-07-12
  • 打赏
  • 举报
回复
仔细阅读“The C++ Standard Library",Josuttis著,孟岩译。
还有Effective STL
里面对你的问题有完全解答
bitxinhai 2010-07-12
  • 打赏
  • 举报
回复
对list的操作,基本都是这样的
首先找到要删除的节点迭代器
然后通过迭代器删除
healer_kx 2010-07-12
  • 打赏
  • 举报
回复
3楼~好了,结贴吧。~
healer_kx 2010-07-12
  • 打赏
  • 举报
回复
3楼~
lin_style 2010-07-12
  • 打赏
  • 举报
回复
分给3楼
lijianli9 2010-07-12
  • 打赏
  • 举报
回复
还没有到30楼
ahao 2010-07-12
  • 打赏
  • 举报
回复
找到了,c++标准应该是有规定的

http://hi.baidu.com/facile_fengsh/blog/item/5061f6b729d538f030add13b.html
保存list的iterator是比较安全的,其实和你C里保存指针基本相同
加载更多回复(4)

64,643

社区成员

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

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