как завершить цикл в определенное время в 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();
}
}
Как я могу это решить? Или, может быть, моя структура не правильная.
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;
// ...
}
Что насчет этого:
unordered_multiset<Element, ElementHash> :: iterator itr;
Element elementTemp1("");
for (itr = almacen.begin(); itr != almacen.end(); ++itr) {
Element tmp(*itr);
if(tmp.getNombre == "prueba"){
break;
}
}
The
break
останавливает выполнение
for
петля в этой точке. Это то, что вы хотите?
Как упоминалось Sneftel в комментарии: ваша программа дает сбой, потому что цикл for выполняется таким образом, что после каждой итерации
- Выполняется операция увеличения/изменения (в вашем коде:
++itr
) - Выполняется проверка, выполняется ли цикл в другой раз (в вашем коде:
itr != almacen.end()
Но когда вы уже устанавливаете итератор в своем цикле на
almacen.end()
вы не можете увеличивать его дальше. Но это то, что происходит после той итерации цикла с Шагом 1, который я описал. И там ваша программа дает сбой.