ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 配对相等的运算符重载以插入集合

2019-09-02 10:07:53  阅读:259  来源: 互联网

标签:std-pair c operator-overloading set


我想添加一对< 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有