繁体   English   中英

如何擦除一对 <int,int> 列表中的元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM