![](/img/trans.png)
[英]How can i erase duplicated elements from a multimap<int, std::pair<int, bool>>?
[英]How to erase a pair<int,int> element in a list
list<pair<int,int>> li{{5,6},{7,8},{9,10}};
for(auto it=li.rbegin();it!=li.rend();++it) {
cout << (*it).first << (*it).second << '\n';
li.erase(it);
}
错误:没有匹配函数调用'std :: list <std :: pair <int,int>> :: erase(std :: reverse_iterator <std :: _ List_iterator <std :: pair <int,int>>>& )'
li.erase(it);
如果将li.erase(it)
替换为li.remove(*it)
,则代码可以正常工作。 但是,所有值都将被删除。算法变为O(n 2 ),而不是O(n),对吗?
迭代时擦除是一个坏主意。 如果it
不再在列表中, ++it
做什么? 好问题! 我不知道,但这不是你想要的,除非你倒霉。 如果程序正常运行,为什么会不走运? 因为它没有,下次它可能会做一些完全不同的事情。
因此,几乎所有似乎有效的基于循环的迭代和删除方法( li.remove(*it)
和li.erase( --(it.base()) )
实际上都无效。
通常,我会提出消除删除的习惯来解决该问题,但是如果您尝试使用C ++的内置工具,则反向迭代器会使情况变得一团糟。 另外,在这种情况下,remove_if的答案始终为true。
对于上述问题,请不要尝试。 相反,打印li.back()
然后li.pop_back()
直到列表为空。
while (!li.empty()) {
cout << li.back().first << li.back().second << '\n';
li.pop_back();
}
您可以将li.erase(it)
替换为li.erase(it.base())
。
std::list.erase
不允许将reverse_iterator
用作参数,因此您首先需要将reverse_iterator
转换为iterator
。
就我所知,关于O(n ^ 2)和O(n)分析,您是正确的。
编辑:
实际上,根据以下类似答案: 如何使用反向迭代器调用擦除
您真正应该做的是li.erase( --(it.base()) )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.