std::set的操作符重载不能正常工作

Operator overloading for std::set is not working properly

本文关键字:常工作 工作 不能 set 操作符 重载 std      更新时间:2023-10-16
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中的数据包通常按升序排列。我插入排序值,但删除任何随机数。有时这个集合是无序的。不明白为什么会这样。这是操作符重载的问题吗?

这里最大的问题是你的operator<是错误的。你排序降序而不是升序,所以你所有的其他代码将不能正常工作。所以首先你需要将operator<固定到return sequenceNumber < rhs.sequenceNumber;

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

然后,您可以使用lower_bound来找到要迭代的结束元素,而不是获得begin并一次又一次地擦除它。