2011-11-21 47 views
2

我已經通過Cplusplus.com上的map :: map reference進行了讀取,我仍然不確定如何使其工作。如果有人能給我一些建議,我會非常感激。將自定義對象插入到std :: map中

所有我想要做的就是創建一個映射如下所示:

std::map<TriSpec, unsigned int> TriSpecMap; 

然後我要插入到它:

result = TriSpecMap.insert(std::make_pair(triSpecObject, anUnsignedInt)); 

任何人都可以向我解釋,如果我的超載正確的操作符,如果我使用的函數/格式正確?當我查看result.second時,當我知道被插入的對象應該已經存在於地圖中時,總是如此。以下是我的TriSpec頭和.cpp

//TriSpec.h 
#ifndef TRISPEC_H 
#define TRISPEC_H 
class TriSpec 
{ 
public: 
    TriSpec(void); 
    ~TriSpec(void); 

    unsigned int m_position; 
}; 
bool operator< (const TriSpec& lhs, const TriSpec& rhs); 
#endif 


//TriSpec.cpp 
#include "TriSpec.h" 

TriSpec::TriSpec(void){} 
TriSpec::~TriSpec(void){} 

bool operator< (const TriSpec& lhs, const TriSpec& rhs) 
{ 
     if (lhs.m_position < rhs.m_position) return true; 
     else return false; 
} 

回答

2

我沒有看到你的代碼的任何問題,除了布爾操作者應朋友的方法(它甚至不編譯沒有朋友的關鍵字):

bool friend operator< (const TriSpec& lhs, const TriSpec& rhs) 
{ 
    return (lhs.m_position < rhs.m_position); 
} 

然後它按預期工作:

int main(int argc, _TCHAR* argv[]) 
{ 
    std::map<TriSpec, unsigned int> TriSpecMap; 

    TriSpec triSpecObject1; 
    triSpecObject1.m_position = 1; 

    TriSpec triSpecObject2; 
    triSpecObject2.m_position = 1; 

    TriSpec triSpecObject3; 
    triSpecObject3.m_position = 3; 

    std::pair<std::map<TriSpec, unsigned int>::iterator, bool> retVal = 
     TriSpecMap.insert(std::make_pair(triSpecObject1, 1)); 

    retVal = TriSpecMap.insert(std::make_pair(triSpecObject2, 1)); 

    retVal = TriSpecMap.insert(std::make_pair(triSpecObject3, 1)); 

    return 0; 
} 

第一次插入的結果是真的,第二次的結果是錯誤的,第三次的結果是真的 - 就像它應該是的。地圖容器中包含兩個對象 - triSpecObject1和triSpecObject3。

0

短的例子,看起來並不像它會編譯 - 你operator<不會在所有情況下返回值。 (編輯:你已經解決了這個問題,謝謝。)你可以把它簡化了不少:

bool operator< (const TriSpec& lhs, const TriSpec& rhs) 
{ 
     return (lhs.m_position < rhs.m_position); 
} 

既然你不顯示,插入到地圖的完整代碼,它不可能說爲什麼返回值.second總是返回true。

+0

它不會編譯的另一個原因是'T C :(:(void)'函數簽名(或任何正確的成員函數形式)。 – moshbear

+1

@moshbear:爲什麼不能編譯?這不是從C繼承的「特徵」之一嗎? –

+0

OP的帖子中的代碼已經修復,因爲這個答案出來了。你可能想要修改你的答案。 –

相關問題