【问题标题】:Operator overloading for std::set is not working properlystd::set 的运算符重载无法正常工作
【发布时间】:2014-08-07 06:47:24
【问题描述】:
struct Buffer
 {     
      const char* data;
      u_int32_t size;
      u_int32_t sequenceNumber;         

      bool operator < (const Buffer &rhs) const
      {   
           return sequenceNumber > rhs.sequenceNumber;     
      }
  };

  std::set<Buffer>bufferData;


  void RemoveElementsFromBuffer(u_int32_t _sequenceNumber)//remove data smaller than _sequenceNumber
  {
       Buffer _packetInformation;
       set<Buffer >::iterator _iterator;
       while(bufferData.begin() != bufferData.end())
       {
           _iterator = bufferData.begin();
           _packetInformation = *_iterator;
           if(_packetInformation.sequenceNumber > _sequenceNumber)
                break; 
           bufferData.erase(_iterator);  
           delete [] _packetInformation.data;
       } 
   }

bufferdata 内的数据包通常是升序排列的。我正在插入排序值但删除任何随机数。有时这个集合是未排序的。不明白为什么会这样。是算子重载的问题吗?

【问题讨论】:

  • 请发布重现问题的最小代码示例。请注意,您不需要包含运算符 &gt;==
  • 我为什么不需要它们?
  • std::set&lt;Buffer&gt; 正常运行不需要它们。另请注意,您实现&lt;&gt; 运算符的方式非常令人困惑!为什么要将 RHS 放在 LHS 上?
  • 是的,这是正确的(尽管您也可以使用自定义比较器实例化 set 模板。)
  • 此示例在运行时是否会产生所描述的问题? data 与所描述的问题有何关系?您的代码中有const_casts 吗?涉及Buffer 或指向相同的指针的C 风格转换怎么样?您是否修改了set 中的Buffers 而在set 中?集合是如何填充的?

标签: c++ sorting set operator-overloading structure


【解决方案1】:

这里最大的问题是你的operator&lt; 是错误的。您正在排序 descending 而不是升序,因此您的所有其他代码都无法正常工作。所以首先你需要将operator&lt; 修复为return sequenceNumber &lt; rhs.sequenceNumber;

接下来,您需要确定您的函数是删除小于请求的元素(来自注释)还是小于/等于(实际代码)。

那么对于奖励积分,您可以使用lower_bound 找到要迭代的结束元素,而不是获取begin 并一遍又一遍地擦除它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2015-04-25
    • 1970-01-01
    • 2013-11-23
    • 2021-02-06
    相关资源
    最近更新 更多