3

我正在使用这个无序的地图:

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',function_pointer)的映射。

指令keys[key] = value; 工作正常。

错误在哪里?

4

1 回答 1

6

这个表达式:

keys[key] == NULL

特别是子表达式:

keys[key]

有副作用就是在map中插入一个新的key-value对,其中keykey为key,对应的value是value-initialized。这就是operator []forstd::unordered_map的工作方式(参见此处)。

另一方面,这个表达式:

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

如果该键已经存在一对(例如,请参见此处),并且在执行以下操作时刚刚插入该值,则不会在映射中插入指定的键值对:

if (keys[key] == NULL)

所以实际上你想要做的只是:

void assign(char key, void (*value)())
{
    keys[key] = value;
}
于 2013-06-17T17:10:54.893 回答