Что означает "result.second == false" в этом коде? - PullRequest
0 голосов
/ 11 февраля 2020

Я наткнулся на этот код 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 ]

7 голосов
/ 11 февраля 2020

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


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

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

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

1 голос
/ 11 февраля 2020

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++;
}
0 голосов
/ 11 февраля 2020

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

0 голосов
/ 11 февраля 2020

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

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

if (not result.second)
// or
if (! result.second)
0 голосов
/ 11 февраля 2020

From cppreference :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...