【问题标题】:map comparator for pair of objects in c++C ++中对象对的映射比较器
【发布时间】:2018-04-08 00:15:36
【问题描述】:

我想使用映射来根据成员输入向量计算对象对。如果为此目的有更好的数据结构,请告诉我。 我的程序返回一个 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) 视为相等。

This answer 说:

根据定义,映射 a 和 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;
    }
};

【问题讨论】:

  • 在您的operator&lt; 中订购每一对,使最低的为第一。然后是正常的词法小于比较。
  • 这可能是一个 XY 问题,您能否详细说明为什么需要此比较,它如何帮助您“计算输入向量对”?你真正想做什么?

标签: c++ stdmap std-pair


【解决方案1】:

我想使用映射来计算输入向量对。如果有更好的数据结构用于此目的,请告诉我。

可以考虑使用std::unordered_map,原因有两个:

  • 如果哈希实现得当,它可能比std::map更快

  • 你只需要实现hash和operator==而不是operator&lt;,在这种情况下operator==是微不足道的

关于如何为std::vector 实现哈希的详细信息可以在here 找到。在您的情况下,可能的解决方案可能是将两个向量合并为一个,对其进行排序,然后使用该方法计算哈希。这是一个简单的解决方案,但会产生许多哈希冲突并导致性能下降。要提出更好的替代方案,需要了解所使用的数据。

【讨论】:

    【解决方案2】:

    据我了解,您想要:

    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 &lt; b,然后我们使用常规比较。

    【讨论】:

      猜你喜欢
      • 2013-03-14
      • 2019-09-18
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多