如何在 unordered_multiset 中的特定时间结束循环

how to end a loop at a particular time in unordered_multiset

早上好,

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

我该如何解决?或者我的结构不对。

这个怎么样:

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 循环的执行方式在每次迭代后执行

  1. increment/change 操作被执行(在您的代码中:++itr
  2. 检查循环是否在另一次执行(在您的代码中:itr != almacen.end()

但是当您将循环中的迭代器设置为 almacen.end() 时,您不能再增加它了。但这就是我描述的第 1 步循环迭代之后发生的情况。然后你的程序崩溃了。

你的问题是你之后递增 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;
    // ...
}