C++ 如何擦除一对<;int,int>;列表中的元素 list li{{5,6}、{7,8}、{9,10}; for(auto it=li.rbegin();it!=li.rend();++it){ cout
您可以将C++ 如何擦除一对<;int,int>;列表中的元素 list li{{5,6}、{7,8}、{9,10}; for(auto it=li.rbegin();it!=li.rend();++it){ cout,c++,list,iterator,std-pair,C++,List,Iterator,Std Pair,您可以将li.erase(it)替换为li.erase(it.base()) std::list.erase不允许将反向迭代器作为参数,因此首先需要将反向迭代器转换为迭代器 据我所知,关于O(n^2)和O(n)分析,你是正确的 编辑: 事实上,根据这个类似的答案: 您真正应该做的是li.erase(--(it.base()))在迭代时擦除是一个坏主意。如果它不再在列表中,那么++it会做什么?好问题!我不知道,但这不是你想要的,除非你运气不好。为什么程序工作不好?因为它不工作,下次它可能会做完全
li.erase(it)
替换为li.erase(it.base())
std::list.erase
不允许将反向迭代器
作为参数,因此首先需要将反向迭代器
转换为迭代器
据我所知,关于O(n^2)和O(n)分析,你是正确的
编辑:
事实上,根据这个类似的答案:
您真正应该做的是
li.erase(--(it.base()))
在迭代时擦除是一个坏主意。如果它不再在列表中,那么++it
会做什么?好问题!我不知道,但这不是你想要的,除非你运气不好。为什么程序工作不好?因为它不工作,下次它可能会做完全不同的事情
因此,几乎所有基于循环的迭代和删除方法似乎都是有效的(li.remove(*it)
和li.erase(--(it.base()))
实际上是无效的
通常情况下,我会提出一个解决这个问题的方法,但是如果你试图使用C++的内置工具,反向迭代器会把问题搞得一团糟
对于上面提出的问题,甚至不要尝试。而是打印li.back()
,然后打印li.pop\u back()
,直到列表为空
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);
}
while(!li.empty()){
无法复制的
while (!li.empty()) {
cout << li.back().first << li.back().second << '\n';
li.pop_back();
}