dynamic int * arrays作为C ++ map的关键

时间:2011-08-22 09:34:54

标签: c++

我有一些动态int *数组,我想用它们作为unordered_map的键。我有点不清楚如何声明键类型,所以它实际上是整个数组的值。

另外,要释放阵列的内存,我是否使用map.clear()

示例:

unordered_map<??, int> frequency;

while (some_condition) {

  int *my_array = new int[size];
  putSomeValuesToArray(my_array);
  frequency[my_array]++;
}

// to deallocate memory for the arrays in frequency?

3 个答案:

答案 0 :(得分:4)

重要提示:如果您在STL容器中使用动态分配的对象,那么要取消分配行走容器所需的内存并调用delete(或delete[])明确。

我强烈建议从int*转移到std::vector<int>,你不会再有内存所有权问题了。


要声明密钥,请将类型作为模板参数传递:

std::unordered_map<int*, Foo>
std::unordered_map<std::vector<int>, Foo>

当然,对于unordered_map,您可能需要一个特定的Hash参数,该参数从您传递的Key中获取哈希值。

答案 1 :(得分:1)

如果你的意思,

int *p = new int[size];

并且您希望将p作为密钥,然后为您提供更好的选择,即使用std::set()

另外,你不能简单地clear()它;您可能希望delete[]之前的每个元素,以避免内存泄漏。如果您不想单独delete[],则可以使用shared_ptr(或其他smart pointers)来为您完成工作。

答案 2 :(得分:0)

您将无法将int*作为密钥放在std::map中,并且仍然可以按值'检索元素。原因是单个int*只提供数组的开头,你需要结束计算任何东西(等价和更像C的长度)。换句话说,int*不是数组(动态或其他)make;在这种情况下,它是序列开始的迭代器。

您可以使用std::pair<int*, int*>,但它只能用于数据的非拥有“视图”。也就是说,如果您使用std::map<std::pair<int*, int*>, int>手动管理内存,您最终会头痛。一种可能是使用智能指针:std::pair<std::unique_ptr<int[]>, int*>。但正如其他人所建议的那样,只需使用std::vector,因为它仍然与处理int*的类似C的接口兼容。另外,const std::pair<std::unique_ptr<int>, int*>仍允许您对内存进行涂鸦,这可能会破坏地图的顺序并使您陷入困境。

使用int*std::unique_ptr<int[]>的最后一击是,您需要提供std::map所需的严格弱排序,而std::vector<int>附带适当的operator< 1}}。另一方面,如果您选择std::unordered_map,则需要为两者提供哈希值。对于它的价值,一个使用std::lexicographical_compare的简单仿函数(与std::vector比较相同的语义):

struct compare {
    typedef std::pair<std::unique_ptr<int[]>, int*> value_type;
    bool
    operator()(value_type const& lhs, value_type const& rhs) const
    {
        return std::lexicographical_compare(lhs.first.get(), lhs.second
                                           , rhs.first.get(), rhs.second);
    }
};

然后您可以使用std::map<std::pair<std::unique_ptr<int[]>, int*>, int, compare>