Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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();
}