C++ 如何将自定义对象插入std::map?

C++ 如何将自定义对象插入std::map?,c++,dictionary,stl,insert,containers,C++,Dictionary,Stl,Insert,Containers,我已经阅读了在的参考资料,但我仍然不知道如何让它发挥作用。我只想创建一个如下所示的地图: std::map<TriSpec, unsigned int> TriSpecMap; 下面是myTriSpec标题和.cpp的一个简短示例: //TriSpec.h #ifndef TRISPEC_H #define TRISPEC_H class TriSpec { public: TriSpec(void); ~TriSpec(void); unsigned i

我已经阅读了在的参考资料,但我仍然不知道如何让它发挥作用。我只想创建一个如下所示的地图:

std::map<TriSpec, unsigned int> TriSpecMap;
下面是my
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.h
#ifndef TRISPEC\u H
#定义三种类型
类三种
{
公众:
三种(无效);
~TriSpec(无效);
无符号整数m_位置;
};
bool运算符<(常数三种类型和左侧、常数三种类型和右侧);
#恩迪夫
//TriSpec.cpp
#包括“TriSpec.h”
TriSpec::TriSpec(void){}
TriSpec::~TriSpec(void){}
bool运算符<(常数三尖和左侧、常数三尖和右侧)
{
如果(左侧m_位置<右侧m_位置)返回true;
否则返回false;
}

我是否重载了正确的运算符?我使用的函数/格式是否正确?当我查看
result.second
时,它总是
true
,即使我知道要插入的对象应该已经存在于映射中。

看起来它不会编译-你的
操作符除了bool操作符应该是friend方法之外,我看不出你的代码有任何问题(如果没有friend关键字,它甚至无法编译):

bool-friend操作符<(常数三种类型和左侧、常数三种类型和右侧)
{
返回(左侧m_位置<右侧m_位置);
}
然后,它会按预期工作:

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;
}
int main(int argc,_TCHAR*argv[]
{
std::map三种映射;
三种三种目标1;
triSpecObject1.m_位置=1;
三种类型三种类型2;
triSpecObject2.m_位置=1;
三种三种目标3;
三尖瓣物体3.m_位置=3;
std::pair retVal=
插入(std::make_pair(triSpecObject1,1));
retVal=TriSpecMap.insert(std::make_pair(triSpecObject2,1));
retVal=TriSpecMap.insert(std::make_pair(triSpecObject3,1));
返回0;
}

第一次插入的结果为true,第二次插入的结果为false a第三次插入的结果再次为true—这是应该的。映射容器包含两个对象—triSpecObject1和triSpecObject3。

因为您也可以使用而不是提供
运算符,或者它不编译的另一个原因是
t C:(void)
函数签名(或者不管成员函数的正确形式是什么)。@moshbear:为什么不编译它?这不是“功能”之一吗从C++继承的?OP的帖子中的代码是固定的,因为这个答案出来了。你可能想修改你的答案。有时我会忘记C的一些相当的HAKISH特性使之成为C++,并且在以后的C/C++修改中不会被贬低。
//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;
}
bool operator< (const TriSpec& lhs, const TriSpec& rhs)
 {
      return (lhs.m_position < rhs.m_position);
 } 
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;
}
int main()
{
    auto comp = [](const TriSpec& t1, const TriSpec& t2) { return t1.m_position < t2.m_position; };
    std::map<TriSpec, unsigned int, decltype(comp)> TriSpecMap(comp);

    TriSpec t1, t2, t3;
    t1.m_position = 1;
    t2.m_position = 3;
    t3.m_position = 5;

    auto retVal = TriSpecMap.emplace(t1, 4);
    retVal = TriSpecMap.emplace(t2, 2);
    retVal = TriSpecMap.emplace(t3, 6);

    for (auto const &kv : TriSpecMap)
        std::cout << kv.first.m_position << ": " << kv.second << std::endl;

    return 0
}