STL карта хранит искомые ключи - PullRequest
3 голосов
/ 13 мая 2009

Я только что узнал, что когда я ищу карту вроде:

  std::map<std::string, int> aMap;

ключи, которые я ищу, начинают быть частью карты. В случае выше значения хранятся в виде нулей. В случае указателей он хранит значения как 0-значные указатели

Я выполняю поиск с помощью оператора [], например:

  int a = aMap["some key"];

Вы можете это подтвердить? Я думаю, что неправильно истолковал оператор []. Это делает задание?!

Где я могу найти документацию STL о подобных "функциях"?

Ответы [ 7 ]

8 голосов
/ 13 мая 2009

Вы ищете его с помощью оператора []? Если так, то да, это определенное поведение.

Вы должны использовать метод 'find', если вам не нужно это поведение.

Хорошим справочником по STL является книга Николая Йосуттиса.

3 голосов
/ 13 мая 2009

Если вы посмотрите на карту с помощью оператора [], то да, вы будете генерировать объекты по умолчанию. Если вы используете «найти», с другой стороны, это не так. Это связано с тем, что оператор [] ДОЛЖЕН возвращать ссылку на объект на карте, поэтому у него нет другого выбора, кроме как сгенерировать его, если его еще нет.

2 голосов
/ 13 мая 2009
int a = aMap["some key"];

Здесь карта проверяет, существует ли на карте ключ "некоторый ключ":

  • если да, то ссылка возвращается значение, соответствующее «Некоторому ключу».
  • Если «какой-то ключ» не существует на карте, то Ключ «Some Key» вставляется в карту со значением по умолчанию. ссылка на вновь введенное значение будет вернулся.

Правильный способ проверки наличия ключа на карте (без добавления ключа на карту):

std::map<key,value>::iterator iter = myMap.find("Some Key");
if( iter != myMap.end())
{
 //key exists
}
else
{
 //no key
}
2 голосов
/ 13 мая 2009

Причина этого заключается в следующем: [] определяется как

T& operator[](KEY k)

Ссылка никогда не может быть NULL, поэтому должно быть возвращено некоторое значение. STL решает эту проблему, вставляя инициализированный элемент по умолчанию.

1 голос
/ 13 мая 2009

Если под поиском вы подразумеваете использование оператора [], например:

if ( m["foo"] == 42 ) {
  // found
}
else {
  // not
}

тогда да, это создаст запись для "foo", если она еще не существует. По этой причине вам, как правило, следует избегать использования оператора [] для карт и использовать вместо них именованные функции sfind () и insert ().

Что касается того, где можно найти информацию об этом поведении, лучшая книга по стандартной библиотеке - Стандартная библиотека C ++ Николая Йосуттиса .

1 голос
/ 13 мая 2009

Звучит так, будто вы используете оператор скобки, т.е.

if (aMap["string"] == something)

Не делай этого. Вместо этого используйте map :: find.

Оператор скобок автоматически вставит ключ в карту, если он не существует, используя значение по умолчанию для части значения.

1 голос
/ 13 мая 2009

Как вы ищете ???

if(!aMap[key]) // not found

Это неверно, когда вы получаете доступ к карте через оператора [], создается соответствующее место и возвращается ссылка.

Вам нужно использовать

if(aMao.find(key)==aMap.end()) // not found
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...