2013-06-17 3 views
3

Я использую эти неупорядоченные карты:unordered_map вставки с пустотой (*)() в качестве значения не работает должным образом

typedef unordered_map <char, void (*)()> Keymap; 
Keymap keys; 

и пытается заполнить его:

void assign(char key, void (*value)()) 
{ 
    if (keys[key] == NULL) 
     keys.insert(Keymap::value_type(key, value)); 
    else 
     keys[key] = value; 
} 

инструкция:

keys.insert(Keymap::value_type(key, value)); 

вставляет символ в ключ, но значение не инициализирован (NULL), поэтому у меня есть карта с («s», NULL) вместо («s», functi on_pointer).

Ключи команды [ключ] = значение; работает правильно.

Где ошибка?

ответ

6

Это выражение:

keys[key] == NULL 

И в частности, Подвыражение:

keys[key] 

имеет побочный эффект вставки новой пары ключ-значение в карте, где key является ключевым, и соответствующее значение инициализируется значением. Вот как operator [] для std::unordered_map предназначен для работы (см. here).

Это выражение, с другой стороны:

keys.insert(Keymap::value_type(key, value)); 

Воле не вставить указанную пару ключ-значение в карте, если одна пара уже присутствует в том, что ключ (см, например, here) , и это значение было просто вставлено при выполнении:

if (keys[key] == NULL) 

Так действительно все, что вы хотите сделать здесь просто:

void assign(char key, void (*value)()) 
{ 
    keys[key] = value; 
} 
+0

большое спасибо –

+0

@FedericoChiaravalli: Рад, что это помогло. Если это решает вашу проблему, пожалуйста, подумайте о том, чтобы отметить ответ, как принято, когда вам разрешат :) –

 Смежные вопросы

  • Нет связанных вопросов^_^