#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
в двух других местах могут дать небольшое улучшение производительности.