2009-05-13 4 views
3

Я только что узнал, что когда я ищу карту как:STL карта хранит поиск ключей

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

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

Я делаю поиск с оператором [], как в:

int a = aMap["some key"]; 

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

Где я могу найти документацию STL об этих «функциях»?

ответ

8

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

Вы должны использовать метод «Найти», если вы не хотите этого поведения.

Хорошей ссылкой для STL является книга Николая Йосуттиса.

1

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

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

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

Вы должны использовать

if(aMao.find(key)==aMap.end()) // not found 
1

Это звучит, как вы с помощью оператора кронштейна, т.е.

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

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

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

3

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

1

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

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

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

Что касается того, где найти информацию об этом поведении, лучшая книга в стандартной библиотеке - The C++ Standard Library by Nicolai Josuttis.

2

Смысл этого: [] определяется как

T& operator[](KEY k) 

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

2
int a = aMap["some key"]; 

Здесь карта проверяет, является ли ключ «какой-то ключ» уже существует на карте:

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

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

std::map<key,value>::iterator iter = myMap.find("Some Key"); 
if(iter != myMap.end()) 
{ 
//key exists 
} 
else 
{ 
//no key 
} 
Смежные вопросы