Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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++ 如何在修改容器时正确迭代容器?_C++_Loops_Iterator - Fatal编程技术网

C++ 如何在修改容器时正确迭代容器?

C++ 如何在修改容器时正确迭代容器?,c++,loops,iterator,C++,Loops,Iterator,我想在遍历容器时修改它。但是第一个版本的代码没有正常工作。有人能解释一下原因吗 //版本1 int main(){ INTA=1,b=2,c=5; std::set m={&a,&b,&c}; 用于(自动mi:m){ std::cout查看std::set::erase的文档: 对已删除元素的引用和迭代器无效 这并不奇怪 现在,考虑一下基于范围的for循环是什么: auto && range = range_expression ; for (auto begin = begin

我想在遍历容器时修改它。但是第一个版本的代码没有正常工作。有人能解释一下原因吗

//版本1
int main(){
INTA=1,b=2,c=5;
std::set m={&a,&b,&c};
用于(自动mi:m){

std::cout查看
std::set::erase
的文档:

对已删除元素的引用和迭代器无效

这并不奇怪

现在,考虑一下基于范围的for循环是什么:

auto && range = range_expression ;
for (auto begin = begin_expr, end = end_expr; begin != end; ++begin) {
    range_declaration = *begin;
    loop_statement
}
注意循环增量在迭代后如何使用当前元素的迭代器。递增无效迭代器的行为尚未定义

在第二个循环中,您总是通过调用
std::set::begin
来获得有效的迭代器


在这种情况下,在迭代时修改容器是没有意义的。编写一个循环来打印所有元素,然后调用
clear
以获得相同的结果


对于特定情况,通常有一种更简单的方法,如上文所述,但如果没有,通常在迭代时修改容器的正确方法是不使用范围,而是使用显式迭代器循环,并使用操作结果(无论是擦除还是插入)作为下一个迭代器值,而不是增加现在无效的迭代器。

我看不出第二个解决方案有任何问题,您可以使用
集合
迭代器

#include <iostream>
#include <set>

using namespace std;

int main(){
    int a=1, b=2, c=5;
    set<int*> m = {&a, &b, &c};
    set<int*>::iterator it = m.begin();

    while(it != m.end()){
        cout << **it << endl;
        it = m.erase(it);
    }
}
#包括
#包括
使用名称空间std;
int main(){
INTA=1,b=2,c=5;
集合m={&a,&b,&c};
set::iterator it=m.begin();
而(it!=m.end()){
库特