Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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++ 删除std::multiset中的元素导致无关迭代器无效 #包括 std::多集; int main(){ s、 插入(1); s、 插入(2); s、 插入(3); 对于(自动i=s.rbegin();i!=s.rend();++i){ auto j=s.lower_bound(*i_C++_C++11 - Fatal编程技术网

C++ 删除std::multiset中的元素导致无关迭代器无效 #包括 std::多集; int main(){ s、 插入(1); s、 插入(2); s、 插入(3); 对于(自动i=s.rbegin();i!=s.rend();++i){ auto j=s.lower_bound(*i

C++ 删除std::multiset中的元素导致无关迭代器无效 #包括 std::多集; int main(){ s、 插入(1); s、 插入(2); s、 插入(3); 对于(自动i=s.rbegin();i!=s.rend();++i){ auto j=s.lower_bound(*i,c++,c++11,C++,C++11,迭代器无效的原因是循环将其擦除,而后续的for迭代在循环的增量部分使用该无效迭代器 如果使用调试器运行此操作,您将看到当调用erase()时,迭代器i指向与迭代器j相同的元素,并且i也将无效。在循环迭代中的++i上,尝试递增无效迭代器,从而导致错误 #include<set> std::multiset<int>s; int main() { s.insert(1); s.insert(2); s.insert(3); for (auto

迭代器无效的原因是循环将其擦除,而后续的
for
迭代在循环的增量部分使用该无效迭代器

如果使用调试器运行此操作,您将看到当调用
erase()
时,迭代器
i
指向与迭代器
j
相同的元素,并且
i
也将无效。在循环迭代中的
++i
上,尝试递增无效迭代器,从而导致错误

#include<set>
std::multiset<int>s;
int main() {
    s.insert(1);
    s.insert(2);
    s.insert(3);
    for (auto i=s.rbegin();i!=s.rend();++i) {
        auto j=s.lower_bound(*i<<1);
        if (j!=s.end())s.erase(j);
    }
}
s.insert(1);
s、 插入(2);
s、 插入(3);
对于(自动i=s.rbegin();i!=s.rend();

++i) //尝试显式比较
i!=j
,看看你关于它们的区别的推理是否正确。@Novelocrat:
i.base()!=j
,因为他处理的是反向迭代器。@Novelocrat我在
j!=s.end()中为
*i
*j
添加了输出
并且只按预期查看
12
。这个问题可能很接近,可以将其作为一个复制品关闭。
s.insert(1);
s.insert(2);
s.insert(3);
for (auto i = s.rbegin(); i != s.rend(); 
     ++i) // <-- It's this that is causing the issue
{
    auto j = s.lower_bound(*i << 1);
    if (j != s.end())
        s.erase(j);  // <-- If `i` is pointing to this element, iteration becomes invalidated
}