Что означает «result.second == false» в этом коде?

Я наткнулся на этот код C ++ для подсчета частоты в векторе.

std::map<std::string, int> countMap;

// Iterate over the vector and store the frequency of each element in map
for (auto & elem : vecOfStrings)
{
   auto result = countMap.insert(std::pair<std::string, int>(elem, 1));
   if (result.second == false)
      result.first->second++;
}

с https://thispointer.com/c-how-to-find-duplicates-in-a-vector/ . Я хочу спросить, что делает

result.second == false ?

Всего 5 ответов


Поскольку std::map и другие не мультиассоциативные контейнеры хранят только уникальные элементы, есть вероятность, что когда вы вставляете что-то в это, оно фактически не будет вставлено, поскольку оно уже может присутствовать. Поэтому insert возвращает std::pair<iterator, bool> где bool будет иметь значение true, если вставка прошла успешно, и false в противном случае.


Я хотел бы отметить, что вы можете избавиться от оператора if в цикле. Из-за того, как operator[] карты работает, цикл можно заменить на

for (const auto & elem : vecOfStrings) // also added const here since we don't need to modify elem
{
   ++countMap[elem];
}

И теперь, если elem существует, вы увеличиваете значение, а если нет, добавляете elem на карту и увеличиваете его значение.


std::map::insert возвращает std::pair<iterator, bool> .

pair.first - это итератор вновь вставленного элемента ИЛИ элемента, который уже был на карте и предотвратил вставку.
pair.second сообщает, произошла ли вставка.

result.second == false определяет случай, когда ничего не было вставлено в карту из-за столкновения клавиш.

Обратите внимание, что в C ++ 17 это может быть написано немного яснее:

auto [itr, inserted] = countMap.insert({elem, 1});
if (!inserted) {
    itr->second++;
}

Из контекста :

Возвращает пару, состоящую из итератора для вставленного элемента (или элемента, который предотвратил вставку) и логическое значение, обозначающее, произошла ли вставка.

result.first предоставляет вам итератор для элемента, а result.second указывает, был ли элемент фактически вставлен или уже существовал.


std::map::insert возвращает пару, где второе значение указывает, действительно ли произошла какая-либо вставка. Если значение равно false , это означает, что значение не было вставлено в карту, поскольку значение с таким же ключом уже существует.

Однако код не должен быть написан так: сравнение с логическими литералами - это бессмысленная операция. Вместо этого вы бы написали

if (not result.second)
// or
if (! result.second)

std::map::insert возвращает пару итераторов и bool . bool указывает, действительно ли вставка произошла. Код, который вы перечислили, похоже, увеличивает отображаемое значение int если при insert происходит столкновение клавиш.


Есть идеи?

10000