【问题标题】:Does the Boost unordered_map only work to associate items with integers?Boost unordered_map 是否仅用于将项目与整数相关联?
【发布时间】:2010-01-18 16:40:27
【问题描述】:

我有一个

HashMap<Node, Double> 

在 Java 中,我稍后将使用它来检索与节点关联的双精度。我试过了

boost::unordered_map<Node*, double> 

但是当我尝试在其中放入一些东西时,我得到一个“错误 C2108:下标不是整数类型”,例如:

map[some_node] = some_double;

如果我正确解释了错误,那么我必须用一个 int 替换我的 double。有没有简单的方法解决这个问题?

好的,下面是函数:

void myClass::someFunction(const double* r)
{
    //map is boost::unordered_map<Node*, double> 
    //nodes is a pointer to std::vector<Node*>
    std::vector<Node*>::iterator it;
    for(it = nodes->begin(); it != nodes->end(); it++)
    {
        //calculate the index
        map[*it] = r[index]; //error
    }
}

【问题讨论】:

    标签: java c++ boost hashmap


    【解决方案1】:

    与 Java 不同,C++ 不为类提供散列函数。如果 hashmap 键的类型是整数或指针,那么 C++ 可以使用整数是它自己的散列这一事实,但它不能用于您自己定义的类型 - 在这种情况下,您必须提供散列显式地发挥作用。这可能很难有效地做到,这是哈希被排除在原始 C++ 标准之外的原因之一,以支持使用树结构而不是哈希表的映射,并且只需要定义 operator

    我还注意到,如果您使用指向节点的指针作为哈希键,将双精度值存储在节点本身中可能会更容易和更快,而不是使用哈希表,因为您实际上已经拥有你要交的节点。

    【讨论】:

    • 虽然这不是我想要的,但你是对的。最好将双精度添加到节点。
    【解决方案2】:

    错误不是地图访问,而是r[index]index 必须是整数类型。

    【讨论】:

    • 哦,是的,不敢相信我没有注意到这一点。我将索引声明为双精度。谢谢!
    【解决方案3】:

    这不是在抱怨双重,而是在抱怨“some_node”。

    您的地图具体定义是什么?

    【讨论】:

      【解决方案4】:

      你没有给出 some_node 的声明,但是如果 some_node 不是一个指针,你会得到这个错误。双倍应该没问题。

      所以你可能需要这样的东西:

      Node some_node;
      ...
      map[&some_node] = some_double; 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 2017-11-24
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多