C ++ передает строку в карту - PullRequest
1 голос
/ 05 августа 2020

В следующем for l oop я проверяю, находится ли буква в запросе в unordered_map<string, int>. Если это не так, я распечатываю некоторые вещи.

queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]
for (vector<string>& q : queries) {
    int start = index[q[0]], end = index[q[1]];
    if (index.find("z") == index.end()) {cout << "z" << '\n';
}

index содержит только a, b, c. Соответственно, вывод будет следующим:

z
z
z
z
z

Что и должно быть, потому что в одном из запросов есть z. Печать размера index дает 3.

Однако, если я запустил это:

for (vector<string>& q : queries) {
    int start = index[q[0]], end = index[q[1]];
    if (index.find(q[0]) == index.end()) {cout << "z" << '\n';
}

, я не получаю никакого вывода, но я ожидаю вывода для x, потому что это отсутствует в index.

Почему это?

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

По описанию оператора [] карты в cppreferance :

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

index[q[0]] создал запись ключа "x".

1 голос
/ 05 августа 2020

operator[] для std::(unordered_)map создает новую запись на карте, если запрошенный ключ не найден.

index содержит только a, b, c .

В вашем первом примере index.find("z") вернет index.end(), если q[0] и q[1] никогда не будут "z", что верно в вашем примере.

Однако к тому времени, когда ваш l oop закончит, index не будет содержать только a, b, c, как вы думаете. Фактически он будет содержать a, b, c, e, x. Когда вы инициализируете start и end значениями index[q[0]] и index[q[1]], operator[] вставляет значения q[0] и q[1] в index, если они еще не существуют *. 1031 *

Я не получаю вывода, но ожидаю вывода для x, потому что его нет в index.

Во втором примере index.find(q[0]) не будет никогда вернет index.end() из-за инициализации start и end значениями index[q[0]] и index[q[1]]. Каждое значение в q[0] и q[1] добавляется к index. Итак, добавление значения q[0] и затем поиск значения q[0] всегда будет успешным и никогда не вернет index.end().

Так что да, на самом деле IS запись для "x" в index, когда l oop достигает последнего vector в queries, содержащем "x" строк, а operator[] добавляет их в index.

...