Когда проверять, существует ли элемент уже в наборе / карте C ?

#c #dictionary #set #unordered-map #unordered-set

#c #словарь #установить #неупорядоченный-карта #неупорядоченный-набор

Вопрос:

У меня есть общий вопрос относительно set, 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, вместо этого предполагается, что count[word] = 0 оно даже не существует на карте.

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

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

Ответ №1:

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

Ответ №2:

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

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

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