как завершить цикл в определенное время в 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 выполняется таким образом, что после каждой итерации

  1. Выполняется операция увеличения/изменения (в вашем коде: ++itr)
  2. Выполняется проверка, выполняется ли цикл в другой раз (в вашем коде: itr != almacen.end()

Но когда вы уже устанавливаете итератор в своем цикле на almacen.end()вы не можете увеличивать его дальше. Но это то, что происходит после той итерации цикла с Шагом 1, который я описал. И там ваша программа дает сбой.

Другие вопросы по тегам