热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

---------------------------问个STL问题。已知一个下标,从LIST里直接删除它,其中找到的复杂度是多少?

看了很多都是BEGIN---END的循环,找到后删除,这个很慢,有没更快的?find??如果没有只好自己写个数组+链表,删除直接偏移到位置
看了很多都是BEGIN---END的循环,找到后删除,这个很慢,
有没更快的?find??


如果没有只好自己写个数组+链表,删除直接偏移到位置

12 个解决方案

#1


好吧 deque的实现就是你说的。

#2


情况不对,不是2分了。完了,估计这家伙以后发帖是0分了。

#3


deque支持随机访问,提供c.erase(pos)方法,删除指定下标元素

#4


那得看是什么样的容器,像deque,vector,string删除pos位置的元素,其查找的时间复杂度都是O(1)的,list就是O(n)了,map和set就是O(logN)了。

#5


引用 4 楼 michael_xie 的回复:
那得看是什么样的容器,像deque,vector,string删除pos位置的元素,其查找的时间复杂度都是O(1)的,list就是O(n)了,map和set就是O(logN)了。


++1
不是排序,只是查找的会用DEQUE,时间是常量,最快

#6


有删除需求建议用多map组合

#7


引用 1 楼 pengzhixi 的回复:
好吧 deque的实现就是你说的。

不会的大侠,偶会结贴的。。

我看了下deque,只有两个接口,push和pop,好像根据不了pos操作呢


引用 4 楼 michael_xie 的回复:
那得看是什么样的容器,像deque,vector,string删除pos位置的元素,其查找的时间复杂度都是O(1)的,list就是O(n)了,map和set就是O(logN)了。


vector我看到这样段代码:
	void _Orphan_range(pointer _First, pointer _Last) const
{ // orphan iterators within specified (inclusive) range
_Lockit _Lock(_LOCK_DEBUG);
const_iterator **_Pnext = (const_iterator **)&this->_Myfirstiter;
while (*_Pnext != 0)
if ((*_Pnext)->_Myptr < _First || _Last < (*_Pnext)->_Myptr)
_Pnext = (const_iterator **)&(*_Pnext)->_Mynextiter;
else
{ // orphan the iterator
(*_Pnext)->_Mycont = 0;
*_Pnext = (const_iterator *)(*_Pnext)->_Mynextiter;
}
}

删除有遍历吧?


其实我想要的就是,插入O(1),根据pos删除,也是O(1).现成容器有解?

#8


deque,vector,string在pos插入和删除时所用的查找时间复杂度都是O(1),但是有可能导致大量的数据移动,总体效率不高。

#9


你看的是queue不是deque,deque都支持[]下标操作

#10


vector.erase(begin()+pos),删除好慢啊好慢,不做点手脚的话,release下的速度起码慢了十倍

#11


引用 9 楼 pengzhixi 的回复:
你看的是queue不是deque,deque都支持[]下标操作


打工去了,回来再看。不过删除的代码里似乎看到了copy的字样哦

#12


去看看有些什么接口吧
http://www.cplusplus.com/reference/stl/deque/

推荐阅读
author-avatar
向着成功一直努力的人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有