定义用于priority_queue的自定义比较器
我想在C++中为char []缓冲区实现minHeap,并且正面临着实现的一些问题。我的优先级队列的声明如下(我不知道这会给我一个maxHeap或minHeap):定义用于priority_queue的自定义比较器
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
字符,然后创建一个堆的顺序值th e序列号。
然而,当我试图推动一个包到这个堆使用:
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>
我应该怎么做才能解决这个问题?
您可以通过执行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()
功能包缓冲区,但你可以在C++ shared_ptr
构造函数中使用任何“删除器”,包括一个你写下自己。
即使在正确编译方面,您提出的修改也不会真正解决。另外,我基本上正在处理返回c风格字符串的网络缓冲区..您会如何建议我应该改变(这是我第一次使用C字符串,我真的很感谢你在这方面的帮助) – akhiljain
@akhiljain:我已经更新了我的答案,并详细介绍了如何在C++中更清晰地使用这些缓冲区。 –
作为一个方面说明,你的代码充满了内存泄漏。我会高度推荐使用'std :: string'来代替'char []'。 –
当你用'push()'调用'buf'时,是什么类型的? –
@JohnZwinck'char [0123]' – akhiljain