我有一个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库。
答案 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;
怎么做?