如何在 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 循环的执行方式在每次迭代后执行
- increment/change 操作被执行(在您的代码中:
++itr
)
- 检查循环是否在另一次执行(在您的代码中:
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;
// ...
}
早上好,
当在 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 循环的执行方式在每次迭代后执行
- increment/change 操作被执行(在您的代码中:
++itr
) - 检查循环是否在另一次执行(在您的代码中:
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;
// ...
}