c++中一对对象的映射比较器

map comparator for pair of objects in c++

本文关键字:映射 比较器 对象 c++      更新时间:2023-10-16

我想使用映射来根据成员输入向量计算对象对。如果有更好的数据结构,请告诉我。我的程序返回一个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,然后使用常规比较。