2009-11-12 108 views
4

在Java和C#现在我回到C++。当然,我的编程风格受这些语言的影响,我倾向于感受到我大量使用的特殊组件的需求:HASH MAP。在STL中有hash_map,GCC表示它已被弃用,我应该使用unordered_map。所以我转向它。我承认我不确定我在做什么的可移植性,因为我不得不使用编译器开关来打开即将到来的标准的功能-std = C++ 0x。无论如何,我对此感到高兴。只要我能不能得到它的工作,因为如果我把我的班C + + STL unordered_map问题和疑惑

std::unordered_map<unsigned int, baseController*> actionControllers; 

和方法:

void baseController::attachActionController(unsigned int *actionArr, int len, 
     baseController *controller) { 
    for (int i = 0; i < len; i++){ 
     actionControllers.insert(actionArr[i], controller); 
    } 
} 

它出来跟平时ieroglyphs说,它不能找到插入...提示?

+0

顺便说一句,为什么不使用std :: map来代替?这将解决您的便携性问题。 – hrnt 2009-11-12 12:57:23

+1

地图有一个哈希映射的访问时间保证不一样......这就是为什么我使用它。 – gotch4 2009-11-12 13:08:01

回答

9

只需使用:

actionControllers[ actionArr[i] ] = controller; 

这是运算符重载的Java欠你了:)

+5

+1:好点。值得注意的是,这和'insert'之间的区别:如果map已经有了key的入口,那么'map [key] = value;'会改变现有的值,而'map.insert(make_pair(key,value ))'不会(并且有一个返回值来表明它失败)。 – 2009-11-12 13:29:59

+1

另外,'map [key] = v'首先在地图上创建一个条目,其中默认值为v的类型,然后才将值v复制到条目中。对于复杂的类型,性能可能有所不同。 – 2009-12-09 14:39:31

1

STL insert通常是map.insert(PAIR(key, value));。也许这是你的问题?

PAIR将std::unordered_map<unsigned int, baseController*>::value_type

+3

whoa dude,std :: make_pair是你的朋友。 – 2009-11-16 18:36:52

+0

他们是一样的东西,所以它只是归结为偏好。有些人更喜欢'std :: make_pair',有些人更喜欢'typedef'-ing,所以你可以看到你插入的东西。两者之间没有其他区别(除了可能用于make_pair的额外函数调用)。 – laura 2009-11-16 23:00:29

+1

@laura:如果类型不完全匹配,那么typedef和'make_pair'之间是有区别的 – 2015-03-21 00:26:02

2

尝试:

actionControllers.insert(std::make_pair(actionArr[i], controller)); 
18

insert需要std::pair<const key_type, mapped_type>类型的单个参数,这是一个键 - 值对。所以,你会使用这样的:

actionControllers.insert(std::make_pair(actionArr[i], controller)); 
+0

这是一种情况,如果标准提供了一个超载来做到这一点,那将会很好。 – 2009-11-16 18:36:02

+0

@deft_code:像....'unordered_map :: emplace'? http://www.cplusplus.com/reference/unordered_map/unordered_map/emplace/“两个参数:一个用于键值,另一个用于映射值。” – 2015-03-21 00:24:11

4

如果您已经决定使用(expreimental并且尚未就绪)C++ 0x,则可以使用这样的语法将密钥值对插入到unordered_map中:

actionControllers.insert({ actionArr[i], controller }); 

这是由gcc支持4.4.0