标准::地图比较指针
std::map comparing pointers
我将如何在下面的示例中实现比较运算符,以使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<
,这样它就不会区分a
和b
,但为所有不相等的对象返回一致的结果。
最简单的方法可能是对指针进行排序,然后进行比较。类似的东西
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
中完成(这是C++11的事情,我假设stdext::hash_map
是等价的),那么你需要实现operator==
并专门针对你的对象进行std::hash<>
。为了您的专业化,您可能只想对两个指针进行哈希处理并组合值(使用类似 bitwise-xor 的东西)。
附加到
这个问题的很长的评论线程的要点与C++标准对指针比较的说法有关。也就是说,比较不是同一对象/数组成员的相同类型的两个对象指针会调用未指定的行为。一般来说,这在任何具有单个统一内存系统的架构(即您可能使用的任何架构)上都无关紧要,但符合标准仍然很好。为此,比较都改为使用std::less<Object*>
,因为C++标准保证std::less<T>
有一个总的排序。
相关文章:
- 智能指针作为无序映射键,并通过引用进行比较
- C++指针比较
- 如果堆栈在数字较低的地址增长,为什么指针比较会逆转这种情况?
- C++中的结构是否按顺序分配内存?每次都以某种方式获得指针比较的正确答案
- 符合要求的编译器应该能够优化哪些指针比较以"always false"?
- C Segfault在指针比较上
- 启用优化时的堆栈指针比较异常
- 有什么方法可以为函数指针比较生成警告?
- Lambda 转换的函数指针比较
- C++:同一对象的基础与派生的指针比较
- 多重继承指针比较
- 从基类指针比较模板化子类的属性
- 有没有一种方法可以禁止C++中的指针比较
- 通过指针比较聚合类型的成员值
- c++指针比较器未编译
- 指针比较 "<" 与数组对象的最后一个元素
- 使用指针比较文本的字符与单个字符
- 字符串与指针比较的问题
- 是c++中指针比较未定义或未指定的行为
- 我们如何检测源代码中的所有指针比较?c++