【问题标题】:Accessing the values of map from its key using pointer to map使用指向映射的指针从其键访问映射的值
【发布时间】:2015-07-18 09:54:40
【问题描述】:

我想在 C++ 中动态分配指向 unordered_map 的指针数组。 std::unordered 映射已被 typedef 为“字典”。

dict_array= ( dictionary **) calloc(input_size, sizeof(dictionary*));

现在我想访问单个哈希图,对于每个单独的哈希图(mydict),我想使用某个键访问值。如下:

for (int i=0; i< input_size, i++){
   dictionary *mydict= dict_array[i];
   mydict[some_key]++;  /*access the value against 'some_key' and increment it*/
}

但是上面这行根据键访问值会产生编译错误。访问它的正确方法是什么?

【问题讨论】:

  • 您是在创建指向标准容器的指针吗?
  • 你为什么使用calloc?在 C++ 中任何提及“动态数组”都会导致强制性的“你为什么不使用std::vector”?

标签: c++ pointers hashmap dynamic-arrays unordered-map


【解决方案1】:

在您的示例中,您实际上还没有分配任何 dictionary 或 (std::unordered_map) 对象。

dict_array[i] 只是一个空指针。因此对mydict 的赋值也会产生一个空指针。您需要首先通过调用dict_array[i] = new dictionary(); 来构造dictionary

表达式mydict[some_key]++ 并不意味着您认为它的作用,因为mydictdictionary * 而不是dictionary。因此,在访问有效的dictionary 对象之前,您需要先实际取消引用它:

(*my_dict)[some_key]++

但同样,在此之前,您需要初始化底层指针。

此外,将 C 分配与 C++ 标准对象混合通常是一个坏主意(这通常会导致未定义的行为)。

【讨论】:

    【解决方案2】:

    你到底为什么要摆弄这样的指针?

    如果你真的想要一个指针数组,那么你必须取消引用才能访问地图本身:

    (*my_dict)[some_key]++;
    

    假设您已正确设置每个指针以指向有效字典。

    或者使用不那么疯狂的数据结构

    std::vector<dictionary> dict_array(input_size);
    
    dict_array[i][some_key]++;
    

    【讨论】:

      【解决方案3】:

      使用运算符[]():

      mydict->operator[](some_key)++;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        • 2017-04-26
        • 1970-01-01
        相关资源
        最近更新 更多