Когда нужно проверить, существует ли элемент в C ++ set / map? - PullRequest
1 голос
/ 21 апреля 2019

У меня есть общий вопрос относительно набора, unordered_set, map, unordered_map в C ++ STL.

Я часто вижу код, который проверяет, есть ли уже элемент в наборе / карте, прежде чем пытаться изменить его значение.

Мне было интересно, когда рекомендуется вручную проверять, существует ли элемент в наборе / карте, прежде чем пытаться изменить его?

Например:

unordered_set<string> banwords(banned.begin(), banned.end());
unordered_map<string, int> count;
string word = "test";

if (banwords.find(word) == banwords.end()){

    ++count[word];
    if (count[word] > maxpair.second){
        maxpair.first = word;
        maxpair.second = count[word];
    }
}

Не выполняется проверка, чтобы определить, существует ли уже слово в счетчике, вместо этого предполагается, что count[word] = 0 еще до того, как оно существует на карте.

С другой стороны, я видел другие потоки, которые поощряют проверку, существует ли элемент первым.

Какое рекомендуемое решение здесь?

Ответы [ 2 ]

4 голосов
/ 21 апреля 2019

Ключевым моментом здесь является то, что когда word еще не находится на карте, count[word] создает новую запись на карте с ключом word и значением 0. Таким образом, ++count[word] всегда действует ; не нужно проверять.

0 голосов
/ 21 апреля 2019

Поскольку целью показанного вами кода является получение незапрещенного слова, которое встречается чаще всего, вам необходимо проверить, находится ли слово в списке запрещенных в первую очередь.Тогда вы можете просто получить прямой доступ к count[word] (без проверки), потому что, если word не находится в count, он будет вставлен со значением по умолчанию, сохраненным в качестве значения (int(), которое будет 0).

Нет общего правила, если вы должны проверить, существует ли ключ на карте или в наборе.Это зависит от того, как вы используете его и каковы ваши цели.

Кстати, в показанном вами коде, поскольку два (или три) вызова count[word], будут два (или3) поиск на карте, чтобы найти пару ключ / значение.Использование int c = ++count[word];, тогда ссылка на c в двух других местах может дать небольшое улучшение производительности.

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