定义用于优先级队列的自定义比较器 我想在C++中实现一个用于char []缓冲区的MIHHAP,并且AM在执行时面临一些问题。我对优先级队列的声明如下(我不确定这是否会给我一个maxHeap或minHeap):
而定义用于优先级队列的自定义比较器 我想在C++中实现一个用于char []缓冲区的MIHHAP,并且AM在执行时面临一些问题。我对优先级队列的声明如下(我不确定这是否会给我一个maxHeap或minHeap):,c++,C++,而TcpPacket::getBytes是: struct comparePacketContents { bool operator()(char lhs[], char rhs[]) const { return atoi(TcpPacket::getBytes(lhs, 0, SEQUENCE_SIZE)) < atoi(TcpPacket::getBytes(rhs, 0, SEQUENCE_SIZE)); } }; char* TcpPacket::getByt
TcpPacket::getBytes
是:
struct comparePacketContents {
bool operator()(char lhs[], char rhs[]) const {
return atoi(TcpPacket::getBytes(lhs, 0, SEQUENCE_SIZE)) < atoi(TcpPacket::getBytes(rhs, 0, SEQUENCE_SIZE));
}
};
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;
}
它给了我以下错误:
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>
重载函数“std::priority_queue::push[with _Ty=char[],_Container=std::vector,_Pr=comparePacketContents]”的实例与参数列表不匹配
参数类型为:(char[2048])
对象类型为:std::priority\u队列
如何解决此错误?您可能可以通过执行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;
类数据包{
公众:
数据包(const char*data);//拥有数据的所有权
uint32_t seqnum()const;//与现有实现类似
// ...
私人:
std::共享的ptr m_数据;
};
数据包::数据包(常量字符*数据):m_数据(数据,免费){
}
bool运算符作为旁注,您的代码充满内存泄漏。我强烈建议使用std::string
代替char[]
。当您使用它调用push()
时,buf
的类型是什么?@JohnZwinckchar[2048]
您建议的修改即使在正确编译方面也不起作用。。另外,我基本上使用的是返回c风格字符串的网络缓冲区。。你会建议我应该如何改变(这是我第一次使用C字符串,我很感激你在这方面的帮助)@ Ak希JAIN:我已经更新了我的答案,并对如何在C++中更简洁地使用这些缓冲区做了更详细的介绍。
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>
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;