2011-11-21 87 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的帖子中的代码已经修复,因为这个答案出来了。你可能想要修改你的答案。 –