【发布时间】:2016-01-24 16:41:51
【问题描述】:
我有一个一般性问题。假设我有一个包含多个不同类型字段的 C++ 类。我想要/需要将此类的对象存储在 std::set 或 std::map 中(以便在 O(log(N)) 中访问它们。
为了做到这一点,我需要重载operator< 但是如果operator< 在我的情况下没有任何逻辑意义怎么办?例如,我有 class faceDescription,其中包含眼睛颜色、鼻子类型等字段。
最明显的是通过像这样比较每个字段来实现operator<:
if (fieldA < other.fieldA)
{
return true;
}
else if (fieldA == other.fieldA && fieldB < other.fieldB)
...
等等。但是如果我有很多字段,这个方法会太长,分支太多,难以阅读,可能难以维护。
我正在考虑将所有字段“打包”到缓冲区中,然后将其与 std::memcmp 之类的内容进行比较,但重点是某些字段可能是指针或不同的类/结构。
所以我的问题:
是否有一种有效且通用的方法来根据字段值为类(可能使用一些 std 方法)定义一个“唯一标识符”,以便这个“唯一标识符” " 可用于比较/排序该类的对象?
编辑
只是一个可以解释动机的例子,每个人都应该清楚:
假设使用人脸识别进行视频处理,以便程序接收人脸描述对象,并且必须计算每个人脸在给定视频中出现的次数。可能有成千上万张面孔。因此,有效的方法是将人脸描述对象的映射作为键和外观的数量作为值。
提前致谢!
【问题讨论】:
-
如果它们没有自然顺序,你为什么要将它们存储在地图中?
-
如果订购它们没有任何意义,为什么还要使用关联容器?
-
@JerryCoffin 以便在 O(log(N)) 中访问它们
-
你打算用什么特征来找到它们?
-
@AlexLop。这并没有真正回答任何问题。是否有(例如)你不能将它们存储在向量中并在 O(1) 中访问它们的原因?
标签: c++ stl operator-overloading stdmap stdset