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

时间:2015-01-12 01:05:06

标签: c++ opencv c++11 stl set

我有一个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库。

2 个答案:

答案 0 :(得分:2)

  

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

嗯,这就是你要求的。您的比较器仅查看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;
    }
}

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

答案 1 :(得分:0)

感谢您的回复。所以,让我们更轻松地完成任务: 1)排序顺序:lhs.first&lt; rhs.first(所以我想按照该对的第一个元素排序)。 2)只有当:lhs.first == rhs.first&amp;&amp; lhs.second == rhs.second。

我认为我很清楚自己想拥有什么。

我正在使用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;

怎么做?