c++中一对对象的映射比较器
map comparator for pair of objects in c++
我想使用映射来根据成员输入向量计算对象对。如果有更好的数据结构,请告诉我。我的程序返回一个int向量列表。每个int向量是两个int向量(一对int向量)之间比较的输出。然而,尽管两个int向量相同(可能顺序不同),但比较的输出可能不同。我想存储每对int向量产生了多少不同的输出(int向量)。
假设我可以用.inp()
访问对象的int向量
当(a1.inp() == a2.inp() && b2.inp() == b1.inp())
或(a1.inp() == b2.inp() and b1.inp() == a2.inp())
时,两对(a1,b1)
和(a2,b2)
应被视为相等。
这个答案是:
映射a和b中的键在定义上是等效的<b或b<a是真的。
class SomeClass
{
vector <int> m_inputs;
public:
//constructor, setter...
vector<int> inp() {return m_inputs};
}
typedef pair < SomeClass, SomeClass > InputsPair;
typedef map < InputsPair, size_t, MyPairComparator > InputsPairCounter;
所以问题是,如何用映射比较器定义两对的等价性。我试图将一对向量的两个向量连接起来,但这导致了(010,1) == (01,01)
,这不是我想要的。
struct MyPairComparator
{
bool operator() (const InputsPair & pair1, const InputsPair pair2) const
{
vector<int> itrc1 = pair1.first->inp();
vector<int> itrc2 = pair1.second->inp();
vector<int> itrc3 = pair2.first->inp();
vector<int> itrc4 = pair2.second->inp();
// ?
return itrc1 < itrc3;
}
};
我想使用映射来计算输入向量对。如果有更好的数据结构,请告诉我
由于两个原因,可以考虑使用std::unordered_map
:
-
如果哈希实现得当,它可能比
std::map
更快 -
您只需要实现hash和
operator==
而不是operator<
,在这种情况下operator==
是微不足道的
有关如何实现std::vector
哈希的详细信息,请参阅此处。在您的情况下,可能的解决方案是将两个向量合并为一个,对其进行排序,然后使用该方法计算哈希。这是一个简单的解决方案,但可能会产生过多的哈希冲突,并导致更差的性能。要提出更好的替代方案,需要了解所使用的数据。
据我所知,您想要:
struct MyPairComparator
{
bool operator() (const InputsPair& lhs, const InputsPair pair2) const
{
return std::minmax(std::get<0>(lhs), std::get<1>(lhs))
< std::minmax(std::get<0>(rhs), std::get<1>(rhs));
}
};
我们将对{a, b}
排序为a < b
,然后使用常规比较。
- 定义具有非标准签名的自定义映射比较器
- 如何为映射和priority_queue编写比较器,其中元素是二维数组
- 使用更大的比较器初始化映射
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- 使用自定义比较器C++映射,不插入所有元素
- C++ priority_queue使用带有 lambda 比较器错误的映射
- C++:对象键的多映射自定义比较器
- C++函数来返回基于参数的比较器通用映射类型?
- c++中一对对象的映射比较器
- 映射的 Lambda 键比较器
- STL 映射自定义比较器
- 将带有自定义比较器的映射传递到功能
- 带有自定义比较器的映射不起作用
- 是否有映射的查找()以使用带参数的比较器
- 成员功能作为映射比较器
- 标准::映射与λ比较器
- 映射运算符<条件 - 无效的比较器
- 使用自己的比较器运算符()进行映射<>。在找不到 KEY 的情况下给出错误
- c++比较器函数,为映射指定特定的键顺序
- 具有透明比较器和异构意义上的非唯一元素的映射或集合