【发布时间】:2013-03-14 21:00:42
【问题描述】:
正如问题所说,我需要以这样的方式使用 std::map。
std::map<std::pair<int, int>, int*> m;
int* a_ptr = new int;
*a_ptr = 15;
m[std::make_pair(1, 2)] = a_ptr;
std::cout << *m[std::make_pair(2, 1)] << std::endl; //should output 15
现在,在我的实际实现中,所有键和值实际上都是指针。我应该如何解决这个问题?
我想到了两个想法。
一个是我应该写一个函数,每次我使用
m[]访问或写入地图,我也应该m.find()检查 其他对组合并照此行事。Other 正在使用带有自定义哈希的 std::unordered_map 当
pair的元素位置被切换时,不知何故没有区别。 (我不知道该怎么做,如果我乘以或添加 两个指针的结果将不相等。如果这是需要一些帮助 要走的路。)
如果您能想到更好的方法,我会很高兴听到它,否则我已经在第二条中说明了我需要帮助的地方。 (我觉得效率更高,第一个不好看)
谢谢。
【问题讨论】:
-
在使用它们作为键之前将地图包装在一个对对元素进行排序的类中(所以
p.first < p.second)? -
为什么要标记这个算法?
-
@Knoothe 解决了这个问题。 Yakk,我不敢相信我从来没有想过。
-
@Tolga 您也可以对指针进行异或运算,该操作是可交换的并且不会溢出。 (然而,基于内存中对象的布局,它可能具有可怕的散列行为。)
-
@millimoose 这在我可以预见的其他一些情况下会派上用场。谢谢。