1

早上好,

unordered_multiset当操作中满足特定条件时,我正在尝试循环end。但它不起作用,并且在循环的下一次迭代中出现分段错误。

代码:

std::unordered_multiset<Element, ElementHash>::iterator itr;
Element elementTemp1("");
for (itr = almacen.begin(); itr != almacen.end(); ++itr) {
    Element tmp(*itr);
    if(tmp.getNombre() == "prueba"){
       itr = almacen.end();
    }
}

我该如何解决?或者也许我的结构不正确。

4

2 回答 2

2

那这个呢:

unordered_multiset<Element, ElementHash> :: iterator itr;
Element elementTemp1("");
for (itr = almacen.begin(); itr != almacen.end(); ++itr) {
Element tmp(*itr);
    if(tmp.getNombre == "prueba"){
       break;
    }
}

在该点停止循环break的执行。for那是你要的吗?

正如 Sneftel 在评论中提到的那样:您的程序崩溃是因为 for-loop 的执行方式在每次迭代之后

  1. 执行增量/更改操作(在您的代码中++itr:)
  2. 检查是否循环再次执行(在您的代码中:itr != almacen.end()

但是,当您已经在循环中设置迭代器时,您将almacen.end()无法进一步增加它。但这就是我描述的第 1 步循环迭代之后发生的情况。在那里你的程序崩溃了。

于 2020-12-27T09:15:32.910 回答
2

你的问题是你end()之后增加,正确的方法是:

std::unordered_multiset<Element, ElementHash>::iterator itr;
Element elementTemp1("");
for (itr = almacen.begin(); itr != almacen.end(); /* Empty */) {
    Element tmp(*itr);
    if (tmp.getNombre() == "prueba"){
        itr = almacen.end();
    } else {
        ++itr;
    }
}

break会更简单,你也可以使用for-range:

std::unordered_multiset<Element, ElementHash>::iterator itr;
Element elementTemp1("");
for (/*const*/auto& element : almacen) {
    if (element.getNombre() == "prueba"){
       break;
    }
}

但按原样,循环大多是无用的。

所以也许你想找到你的谓词为真的位置,那么你可以使用std::find_if

auto itr = std::find_if(almacen.begin(), almacen.end(),
                        [](/*const*/auto& element){ return element.getNombre() == "prueba"; });
if (itr != almacen.end()) {
    /*const*/ auto& element = *itr;
    // ...
}
于 2020-12-27T09:44:00.743 回答