значение элемента карты хеша не печатается должным образом - PullRequest
1 голос
/ 19 мая 2011

Я вставляю пару (ключ, значение) в мою хэш-карту, но, кажется, у нее нет значения при попытке ее распечатать

Дело в том, что я не знаю, почему я не могунапечатать второй элемент в следующем коде.

Давайте посмотрим код:

.h

typedef hash_map<const string, string, strptrhash, strptrequal> StringHashMap;  
StringHashMap m_memberNameMap; 
typedef pair <const string,string> string_pair; 

.cpp

void Powerdomain::addMemberName(const string& name){  

if (m_memberNameMap[name]==""){
    m_memberNameMap.insert(string_pair(name,name));
    StringHashMap::iterator it = m_memberNameMap.begin();
    cout << it->first << endl;
    cout << it->second << endl;
    cout << m_memberNameMap["MD1"] << endl;
}

с именем= "MD1" это выводит:

MD1  
*blank*  
*blank*   

РЕДАКТИРОВАТЬ

относительно ответа Алана:

ModuleType * moduletype4=new ModuleType("type4");
ModuleType * value = moduleTypeMap["type4"];

if (value==NULL) {
   ModuleType& value2=*moduleTypeMap["type4"];
   value2=*moduletype4;
   cout << "correctly inserted" << endl;
}
cout << moduleTypeMap["type4"]->getName() << endl;  

Это не работает.Я мог бы быть смущен сейчас!

Ответы [ 3 ]

4 голосов
/ 19 мая 2011

Что делает m_memberNameMap[name] в состоянии if?Если ключ name не существует на карте, он создает новый слот с этим ключом и значением, равным пустой строке.

То есть выражение m_memberNameMap[name] вызывает operator[], который вставляет элемент, равный string_pair(name, "") на карту, если ключ name не существует,

Решениеиспользовать find как:

if (m_memberNameMap.find(name) == m_memberNameMap.end())
{
    m_memberNameMap.insert(string_pair(name,name));
    //rest of the code...
}

Вместо функции insert вы также можете использовать:

   m_memberNameMap[name] = name; //simpler, cute!

В конце концов, operator[] создает новый слот, если ключне существует.

4 голосов
/ 19 мая 2011

Здесь есть несколько заблуждений.Во-первых, используя operator[] на карте, вставит новый (пустой) элемент с ключом name.Семантика этого оператора заключается в том, что если вы получаете доступ к элементу внутри карты, он должен быть там, поэтому, если он не существует, он создается.Затем операция insert определяется как , а не , чтобы добавить элемент, если он уже существует, так что это ваша проблема.

Сначала вы должны использовать find:

if (m_memberNameMap.find(name) == m_memberNameMap.end()) // don't exist
{
   // rest of your code
}
1 голос
/ 19 мая 2011

Или, если вы хотите использовать operator [], вы можете просто сохранить его результат, чтобы убедиться, что происходит только один поиск:

string & value = m_memberNameMap[name];
if (value.empty()) {
   value = name;
   // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...