Использование set.insert (ключ) в качестве условного?
-
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.
}