免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 11756 | 回复: 37
打印 上一主题 下一主题

list::iterator适合像普通指针一样被保存(cache)么 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-28 21:25 |只看该作者 |倒序浏览
本帖最后由 rocklinux 于 2012-02-28 23:41 编辑

我用C++开发时,如果碰到需要对无序数据集高效删除插入的场景时,会选用STL中的list保存数据。

我们知道,list增删操作高效的前提是已经知道要操作的元素的位置,不然的话需要先遍历链表,找到需要操作的元素后再操作,这样效率就明显降低了,所以我希望我在之前的一次遍历找到要操作的元素的后能保存这个位置,方便以后进行操作。

如果是用C语言开发,我会好不忧虑将该地址保存在一个指针里,比如在某个struct中定义一个int *last字段。但是在C++中,难道我要在类中定义一个类似list<int>::iterator last的字段?我觉得这样很ugly。大家碰到这样的场景会怎么做?

论坛徽章:
0
2 [报告]
发表于 2012-02-28 21:41 |只看该作者
还是自己写吧 iterator 和指针并不相同 在插入数据的过程中iterator 会变

论坛徽章:
0
3 [报告]
发表于 2012-02-28 21:50 |只看该作者
我看了一下  貌似   由指针 无法 转化成 iterator
  

论坛徽章:
0
4 [报告]
发表于 2012-02-28 23:41 |只看该作者
回复 3# longmm1988

我不是要将普通指针转化为iterator。

我是说,如果我用STL的list存储数据的话,将iterator保存下来以便在以后其他地方使用,这是是好的设计么?
比如:

class {
private:
    list<int>::iterator last_iter;
};

void A::func1()
{
    *
    *
    last_iter = int_list.find(4);
    *
}

void A::func2()
{
     *
     *
     int_list.erase(last_iter);
     *
}

   

论坛徽章:
0
5 [报告]
发表于 2012-02-29 08:45 |只看该作者
list的iterater所指向的对象如果没有被删除,那么iterater是一直有效的,其他容器不一定。

论坛徽章:
0
6 [报告]
发表于 2012-02-29 09:19 |只看该作者
原来是这样 我一直以为所有的iterator 都会变 呵呵  受教了回复 5# drangon


   

论坛徽章:
0
7 [报告]
发表于 2012-02-29 09:48 |只看该作者
回复 5# drangon


    那你觉得保存list::iterator是个好的设计么。如果不能保存list元素的地址,那么list的功能就很受限制了。

我之所以对这种设计有疑虑,1) 这样会将list<Type>::iterator暴露出来,比如可能会有接口需要迭代器这样的参数(除STL外)。2)虽然list::iterator可以保证有效,但我一直对C++各种封装不感冒,觉得它们会导致很多潜在的盲点。。。

论坛徽章:
0
8 [报告]
发表于 2012-02-29 10:01 |只看该作者
我觉得你这种想达到快取的目的,完全可以使用vector。。如果数据量大用map也行。

论坛徽章:
0
9 [报告]
发表于 2012-02-29 11:13 |只看该作者
本帖最后由 x5miao 于 2012-02-29 11:14 编辑

觉得迭代器没什么啊,就是对指针功能的抽象并添加一些安全功能。

论坛徽章:
0
10 [报告]
发表于 2012-02-29 11:27 |只看该作者
回复 8# scgywx


    我不只是要快取,而是要删除,vector删除非末尾元素效率很低。

准确的说,是希望只搜索一次,保存得到的元素地址,在后面对该元素的操作直接通过保存的地址,最后删除元素。这样除了第一次搜索外,其它操作都是常数代价。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP