2015-09-26 50 views
0

我想在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> 

我应该怎么做才能解决这个问题?

+5

作为一个方面说明,你的代码充满了内存泄漏。我会高度推荐使用'std :: string'来代替'char []'。 –

+0

当你用'push()'调用'buf'时,是什么类型的? –

+0

@JohnZwinck'char [0123]' – akhiljain

回答

0

您可以通过执行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构造函数中使用任何“删除器”,包括一个你写下自己。

+0

即使在正确编译方面,您提出的修改也不会真正解决。另外,我基本上正在处理返回c风格字符串的网络缓冲区..您会如何建议我应该改变(这是我第一次使用C字符串,我真的很感谢你在这方面的帮助) – akhiljain

+0

@akhiljain:我已经更新了我的答案,并详细介绍了如何在C++中更清晰地使用这些缓冲区。 –