Использование set.insert (ключ) в качестве условного? - PullRequest
8 голосов
/ 21 октября 2008

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

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

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

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal

Ответы [ 3 ]

14 голосов
/ 21 октября 2008

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

if( set.insert( key ).second ) {
      // code
}
2 голосов
/ 21 октября 2008

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

if( set.insert( key ).second ) {
    // some kind of code
}
1 голос
/ 21 октября 2008

В других ответах предлагалось использовать только «.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.
}
...