我有一些动态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?
答案 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>
。