Карта C ++ поверх итератора? - PullRequest
2 голосов
/ 06 апреля 2011

Я просматриваю код, который выглядит примерно так

map<string, int>::iterator itr = mValue.find(inName);

Почему они определяют итератор. Разве нельзя сказать что-то вроде

int value = mValue.find(inName)

Спасибо.

Ответы [ 7 ]

16 голосов
/ 06 апреля 2011

Вы можете получить значение, разыменовав итератор (как если бы это был указатель).Это возвращает тип пары ключ / значение, который имеет член second, который имеет значение:

map<string, int>::iterator itr = mValue.find(inName);
int value = itr->second;

Причина, по которой возвращается итератор, заключается в том, что итератор end() возвращается, когда совпадение не можетне найти:

map<string, int>::iterator itr = mValue.find(inName);
if (itr == mValue.end())
{
  throw "No value could be found.";
}

int value = itr->second;

Надеюсь, в этом есть какой-то смысл.

5 голосов
/ 06 апреля 2011

Что произойдет, если этот ключ не существует на карте?Что бы вы вернули за find?С помощью итератора вы можете вернуть mValue.end().Кроме того, итераторы разрешают итерацию, а int - нет.

2 голосов
/ 06 апреля 2011

mValue.find(inName) возвращает итератор в положение на карте, в котором находится ключ inName. Если вам просто нужно соответствующее значение, вы можете использовать mValue[inName].

1 голос
/ 06 апреля 2011

Почему они определяют итератор.

Поскольку это то, что возвращает функция map .find (), итератор, содержащий ключ и значение. Или возвращает mValue.end (), если значение не найдено, что полезно, поскольку вы можете проверить, было ли найдено значение на карте или нет.

, чтобы получить значение, которое вы можете сделать:

map<string, int>::iterator itr = mValue.find(inName);
if(itr != map.end()) {
  int value = itr->second;
  // use value
}

Разве нельзя сказать что-то вроде int value = mValue.find (inName)

Нет, std :: map не имеет такой функции. (и если бы это произошло, пришлось бы выдать исключение в случае, если значение не было найдено)

1 голос
/ 06 апреля 2011

Возможно, вы захотите использовать

map<string, int>::iterator itr = mValue.find(inName);
int value = mValue[inName];

mValue[inName] = 1234;

Будьте осторожны, он не будет работать на карте констант (потому что не сможет вставить запись)

1 голос
/ 06 апреля 2011
int value = mValue.find(inName)->second;

при условии, что находка не вернулась mValue.end()

0 голосов
/ 06 апреля 2011

Оригинал:

Потому что find возвращает позицию пары на карте, где найден ключ.В случае, если он не найден, он возвращает NULL и, следовательно, проверяет

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

Обновить ответ:

Потому что find возвращает позицию пары на карте, где найден ключ.Если он не найден, он возвращает map.end ().

...