我想在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>
我该怎么做才能解决此错误?
答案 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
构造函数中,包括你自己编写的构造函数。