【问题标题】:C++ STL unordered_map problems and doubtsC++ STL unordered_map问题及疑惑
【发布时间】:2010-12-15 20:42:41
【问题描述】:

在使用 Java 和 C# 几年后,我又回到了 C++。当然,我的编程风格受到这些语言的影响,我倾向于觉得需要一个我大量使用的特殊组件:HASH MAP。在 STL 中有 hash_map,GCC 说它已被弃用,我应该使用 unordered_map。所以我转向它。我承认我不确定我正在做的事情的可移植性,因为我必须使用编译器开关来打开即将推出的标准的 -std=c++0x 功能。无论如何,我对此很满意。只要我不能让它工作,因为如果我上课了

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);
    }
}

它带有通常的象形文字,说它找不到周围的插入...提示?

【问题讨论】:

  • 顺便说一句,为什么不使用 std::map 呢?这将解决您的便携性问题。
  • 一个映射没有与哈希映射相同的访问时间保证......这就是我使用它的原因。

标签: c++ stl hashmap c++11


【解决方案1】:

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

PAIR 将是 std::unordered_map&lt;unsigned int, baseController*&gt;::value_type

【讨论】:

  • 哇老兄,std::make_pair 是你的朋友。
  • 它们是同一个东西,所以归结为偏好。有些人更喜欢std::make_pair,其他人更喜欢typedef-ing,这样您就可以看到您正在插入的内容。两者之间没有其他区别(可能除了用于 make_pair 的额外函数调用)。
  • @laura: 如果类型不完全匹配,那么 typedef 和 make_pair 之间就有区别@
【解决方案2】:

试试:

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

【讨论】:

    【解决方案3】:

    insert 接受一个参数,它是一个键值对,类型为 std::pair&lt;const key_type, mapped_type&gt; 。所以你会这样使用它:

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

    【讨论】:

    【解决方案4】:

    只需使用:

    actionControllers[ actionArr[i] ] = controller;
    

    这是java操作符重载你好久了:)

    【讨论】:

    • +1:好点。值得注意的是这和insert 之间的区别:如果映射已经有一个键的条目,那么map[key] = value; 将改变现有的值,而map.insert(make_pair(key,value)) 不会(并且有一个返回值表明它失败)。
    • Furthurmore,map[key] = v 首先在映射中使用 v 类型的默认值创建一个条目,然后才将值 v 复制到该条目中。对于复杂的类型,性能可能会有差异。
    【解决方案5】:

    如果您已经决定使用(实验性且尚未准备好)C++0x,那么您可以使用这样的语法将键值对插入到 unordered_map 中:

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

    gcc 4.4.0 支持此功能

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多