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