gpt4 book ai didi

c++ - std::map 比较指针

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:57 24 4
gpt4 key购买 nike

如何在下面的示例中实现比较运算符,以便 ObjectPair( &a, &b ) 等于 ObjectPair( &b, &a )?此外,我如何使用 stdext::hash_map 而不是 std::map 来实现它?

struct ObjectPair
{
public:

ObjectPair( Object* objA, Object* objB )
{
A = objA;
B = objB;
}

bool operator<( const ObjectPair& pair ) const
{
// ???
}

Object* A;
Object* B;
};

int main()
{
std::map< ObjectPair, int > pairMap;

Object a;
Object b;

pairMap[ ObjectPair(&a, &b) ] = 1;
pairMap[ ObjectPair(&b, &a) ]++;

/// should output 2
std::cout<< pairMap[ ObjectPair( &a, &b ) ] << std::endl;

return 0;
}

最佳答案

您的根本问题是您需要实现 operator<这样它就不会区分 ab , 并为所有不相等的对象返回一致的结果。

最简单的事情可能是对指针进行排序,然后比较它们。有点像

bool operator<(const ObjectPair& pair) const {
// Technically < is unspecified on most object pointers
// but std::less<T> is guaranteed to have a total ordering
std::less<Object*> comp;
Object *ourlow = std::min(a, b, comp);
Object *ourhigh = std::max(a, b, comp);
Object *theirlow = std::min(pair->a, pair->b, comp);
Object *theirhigh = std::max(pair->a, pair->b, comp);
if (comp(ourlow, theirlow)) return true;
if (comp(theirlow, ourlow)) return false;
return comp(ourhigh, theirhigh);
}
return false;
}

当然,这是假设 Object不可排序,因此我们只关心指针值是否相同。如果Object本身有一个顺序,那么你应该调用 Object::operator<()而不是仅仅使用 <在指针上,即 if (*ourlow < *theirlow)


为了在 std::unordered_map 中完成这项工作(这是我假设 stdext::hash_map 等价于 C++11 的东西)然后你需要实现 operator==以及专业std::hash<>为你的对象。对于您的特化,您可能只想散列两个指针并组合这些值(使用类似按位异或的方法)。


这个问题附带的很长的评论线程的要点与 C++ 标准关于指针比较的内容有关。也就是说,比较两个不是同一对象/数组成员的相同类型的对象指针会调用未指定的行为。一般来说,这对任何具有单一统一内存系统的体系结构(即您可能使用的任何体系结构)都无关紧要,但符合标准仍然很好。为此,比较都已更改为使用 std::less<Object*> ,因为 C++ 标准保证 std::less<T>有总序。

关于c++ - std::map 比较指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com