c – 配对相等的运算符重载以插入集合
作者:互联网
我想添加一对< int,int>一套.如果一对在集合中与另一个值共享相同的两个值,则不应插入它.
这是我的非工作代码:
typedef std::pair<int, int> PairInt;
template<>
bool std::operator==(const PairInt& l, const PairInt& r)
{
return (l.first == r.first && l.second == r.second) ||
(l.first == r.second && l.second == r.first);
}
int main()
{
std::set<PairInt> intSet;
intSet.insert(PairInt(1,3));
intSet.insert(PairInt(1,4));
intSet.insert(PairInt(1,4));
intSet.insert(PairInt(4,1));
}
此刻,即使已经存在(1,4)对,也会添加(4,1)对.该集的最终内容是:
(1 3)
(1 4)
(4 1)
我想要它
(1 3)
(1 4)
我已经尝试在重载方法中放置断点,但它们永远不会到达.我做错了什么?
解决方法:
比较应确定第一项是否小于第二项.所以它应该是这样的:
namspace std
{
template<>
bool operator < (const PairInt& l, const PairInt& r)
{
//swap only if they're unequal to avoid infinite recursion
if (l.first != l.second)
{
//swap elements, considering your special case
if (l.first == r.second && l.second == r.first)
return l < PairInt(r.second, r.first); //call again!
}
//actual comparison is done here
if ( l.first != r.first )
return l.first < r.first;
else
return l.second < r.second;
}
}
现在它提供了所需的输出:
1,3
1,4
看看online demo.
请注意,比较功能如下:Strict weak ordering
标签:std-pair,c,operator-overloading,set 来源: https://codeday.me/bug/20190902/1790141.html