【发布时间】:2015-03-09 17:54:05
【问题描述】:
我有一个 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 仅在该对的第二个值相等(或第一个和第二个相等)的情况下才将元素视为相等。怎么做??
附:我不想使用 boost 库。
【问题讨论】:
-
std::pair的默认比较如何不适合您的目的? -
你所描述的你想要的和你的比较似乎是两件不同的事情。
-
@RetiredNinja,我想要两件事:我想要
std::set和std::pair:1) 按配对的第一个值排序。 2)仅当对的第二个值相等时才将值视为相等(这在插入元素时很重要)。我的比较器只满足第一个要求。 -
一个集合使用相同的比较来排序和确定等价。您的需求与此不符。您需要选择不同的容器。
-
集合中的相等性由排序决定。如果
!(lhs < rhs) && !(rhs < lhs),则认为两个元素(lhs 和 rhs)相等。 (其中<是您的比较函数)因此,如果您希望在确定相等性时考虑某个字段,则需要在排序中考虑该字段。