c ++

时间:2017-10-26 14:41:34

标签: c++ stdmap std-pair

我想使用地图根据成员输入向量计算对象对。如果有更好的数据结构用于此目的,请告诉我。 我的程序返回一个int向量列表。每个int向量是两个int向量(一对int向量)之间的比较的输出。然而,尽管两个int向量相同(可能以不同的顺序),但比较的输出可能是不同的。我想存储每对int向量产生多少个不同的输出(int向量)。

假设我可以使用.inp()

访问我对象的int向量

(a1,b1)(a2,b2)时,应将两对(a1.inp() == a2.inp() && b2.inp() == b1.inp())(a1.inp() == b2.inp() and b1.inp() == a2.inp())视为相等。

This answer说:

  

当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;
    }
};

2 个答案:

答案 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,然后我们使用常规比较。