std::set 和 std::pair - 如何为元素编写比较器

std::set with std::pair - how to write comparator for elements

我有一个 std::set 包含 std::pair<T1, T2> 类型的值,按对的第一个值排序:

struct Comparator
{
    bool operator() (const std::pair<T1, T2>& lhs, const std::pair<T1, T2>& rhs) const
    {
        return lhs.first < rhs.first;
    }
}

我的定义是std::set<std::pair<T1, T2>, Comparator> s.

但是当我尝试插入具有相同第一个值的对时,元素插入到之前的集合中(第二个值不同)。该集不插入它。

我希望 std::set 仅在对的第二个值相等(或第一个和第二个相等)时才将元素视为相等。怎么做??

P.S。我不想使用 boost 库。

But when I try to insert pair with the same first value with element inserted to the set before (second value is different). The set does not insert it.

嗯,这就是你所要求的。您的比较器只查看 first 成员,而 std::set 不允许重复条目。我想您可能想先按 first 成员排序,如果相等,则按 second 排序。因此,将您的比较器更改为如下所示:

struct Comparator
{
    bool operator() (const std::pair<T1, T2>& lhs,
                     const std::pair<T1, T2>& rhs) const
    {
      if (lhs.first == rhs.first)
        return lhs.second < rhs.second;
      else
        return lhs.first < rhs.first;
    }
}

请注意,这是 std::pair would do anyway 的默认运算符 <,因此如果您需要此特定顺序,只需使用默认值即可。

感谢您的回复。所以,让我们让它更容易: 1)排序顺序:lhs.first < rhs.first(所以我想按对的第一个元素排序)。 2) 只有在 lhs.first == rhs.first && lhs.second == rhs.second 时,集合才应将 pair 视为相等(并禁止插入)。

我想很清楚我想要什么。

我正在使用 CV Open 库编写应用程序。我的集合定义为:

std::set<std::pair<double, cv::Point>, QComparator> s;

其中 QComparator 是:

struct QComparator
{
    bool operator() (const std::pair<double, cv::Point>& lhs, const std::pair<double, cv::Point>& rhs) const
    {
        return lhs.first < rhs.first;
    }
};

P.S。 我将解释什么是 CV 库中的 cv::Point:

typedef Point_<int> Point2i;
typedef Point2i Point;

怎么做?

这个比较器似乎有效。

struct Comparator
{
    bool operator() (const std::pair<T1, T2>& lhs,
                     const std::pair<T1, T2>& rhs) const
    {
        if (lhs.second == rhs.second)
            return false
        if (lhs.first == rhs.first)
            return lhs.second < rhs.second
        return lhs.first < rhs.first
    }
}