2015-09-26 89 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++中更清晰地使用這些緩衝區。 –