定义自定义比较器以与priority_queue一起使用

时间:2015-09-26 13:27:18

标签: c++

我想在c ++中为char []缓冲区实现minHeap,并且面临实现的一些问题。我对优先级队列的声明如下(我不确定这是否会给我一个maxHeap或minHeap):

priority_queue<char[], vector<char[]>, comparePacketContents> receiveBuffer;

其中comparePacketContents是:

struct comparePacketContents {
  bool operator()(char lhs[], char rhs[]) const {
    return atoi(TcpPacket::getBytes(lhs, 0, SEQUENCE_SIZE)) < atoi(TcpPacket::getBytes(rhs, 0, SEQUENCE_SIZE));
  }
};

TcpPacket::getBytes是:

char* TcpPacket::getBytes(char* buf, int start, int size) {
  char* ans = (char *) malloc(sizeof(char)*size);
  for (int i = 0; i < size; i++) {
    *(ans + i) = *(buf + start + i);
  }
  return ans;
}

基本上我打算获取收到的数据包的第一个SEQUENCE_SIZE字符,然后创建一个按序列号的值排序的堆。

但是,当我尝试使用以下命令将数据包推入此堆时

receiveBuffer.push(buf);

它给了我以下错误:

no instance of overloaded function "std::priority_queue<_Ty, _Container, _Pr>::push [with _Ty=char [], _Container=std::vector<char [], std::allocator<char []>>, _Pr=comparePacketContents]" matches the argument list
argument types are: (char [2048])
object type is: std::priority_queue<char [], std::vector<char [], std::allocator<char []>>, comparePacketContents>

我该怎么做才能解决此错误?

1 个答案:

答案 0 :(得分:0)

你可以&#34;修复&#34;通过执行push(&buf)显式地将指针推送到数组的开头来进行编译错误。否则编译器认为你想推送整个数组,而容器保存指针(char[]就像char*)。

但是,这可能不足以解决您遇到的所有问题,因为您似乎正在将原始指针存储到C风格的字符串,而无需正确管理这些分配。相反,考虑编写一个类来保存数据包:

class Packet {
public:
    Packet(const char* data); // takes ownership of data

    uint32_t seqnum() const; // similar to existing implementation
    // ...

private:
    std::shared_ptr<char> m_data;
};

Packet::Packet(const char* data) : m_data(data, free) {
}

bool operator<(const Packet& lhs, const Packet& rhs) {
    return lhs.seqnum() < rhs.seqnum();
}

priority_queue<Packet> receiveBuffer;

在我的示例中,我假设您使用C free()函数释放数据包缓冲区,但您可以使用任何&#34;删除&#34;在C ++ shared_ptr构造函数中,包括你自己编写的构造函数。