我想使用地图根据成员输入向量计算对象对。如果有更好的数据结构用于此目的,请告诉我。 我的程序返回一个int向量列表。每个int向量是两个int向量(一对int向量)之间的比较的输出。然而,尽管两个int向量相同(可能以不同的顺序),但比较的输出可能是不同的。我想存储每对int向量产生多少个不同的输出(int向量)。
假设我可以使用.inp()
在(a1,b1)
或(a2,b2)
时,应将两对(a1.inp() == a2.inp() && b2.inp() == b1.inp())
和(a1.inp() == b2.inp() and b1.inp() == a2.inp())
视为相等。
当a和b都没有时,映射a和b中的键是相同的 < b和b<是的。
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;
}
};
答案 0 :(得分:1)
我想使用地图来计算输入向量对。如果有更好的数据结构,请告诉我。
由于两个原因,可以考虑使用std::unordered_map
:
如果哈希正确实施,它可能比std::map
你只需要实现哈希和operator==
而不是operator<
,operator==
在这种情况下是微不足道的
有关如何找到std::vector
的工具哈希的详细信息here。在您的情况下,可能的解决方案是将两个向量连接成一个,对其进行排序,然后使用该方法来计算哈希值。这是一个简单的解决方案,但可以产生许多哈希冲突并导致更差的性能。建议更好的替代方案需要了解所使用的数据。
答案 1 :(得分:0)
据我了解,你想:
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
,然后我们使用常规比较。