Использование set.insert (ключ) в качестве условного?

StackOverflow https://stackoverflow.com/questions/220718

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать set.insert (key) в качестве условия, где, если ключ вставлен правильно (имеется в виду, что ключ НЕ существует в наборе), он должен продолжаться и выполнять какой-то код. Например, что-то вроде:

if (set.insert( key )) {
    // some kind of code
}

Это разрешено? Поскольку компилятор выдает эту ошибку:

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal
Это было полезно?

Решение

Версия вставки, которая принимает одно значение ключа, должна возвращать std::pair<iterator,bool>, где bool указывает, была ли произведена вставка. Значение true указывает, что значение было вставлено, а false указывает, что значение уже присутствовало. Так что ваше условное выражение будет выглядеть так:

if( set.insert( key ).second ) {
      // code
}

Другие советы

set :: insert возвращает пару, попробуйте это:

if( set.insert( key ).second ) {
    // some kind of code
}

В других ответах предлагалось использовать только «.second», и это сработает, но если для обработки, которую вам нужно выполнить, используется существующая запись в наборе, вы можете сохранить полный результат вставки:

std::pair<std::set<key>::iterator, bool> iResult = set.insert (key);
if (iResult.second) {
    // some kind of code - insert took place
}
else {
    // some kind of code using iResult.first, which
    // is an iterator to the previous entry in the set.
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top