如何将自定义对象插入到std::map中

How can I insert custom objects into a std::map?

本文关键字:std map 插入 自定义 对象      更新时间:2023-10-16

我已经在cplusplus.com上阅读了map::map参考,我仍然不确定如何让这个工作。我所要做的就是像下面这样创建一个映射:

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

然后我想插入如下内容:

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

下面是一个简短的例子,我的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;
}

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

我不认为你的代码有任何问题,除了bool操作符应该是friend方法(它甚至不编译没有friend关键字):

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;
}

第一次插入的结果为真,第二次插入的结果为假,第三次插入的结果又为真。map容器包含两个对象:triSpecObject1和triSpecObject3。

这看起来不像它会编译-您的operator<在所有情况下都不返回值。(编辑:你已经解决了这个问题,谢谢。)您可以简化它:

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

由于没有显示插入到映射中的完整代码,因此无法说明为什么返回值.second总是返回true。

自c++ 11以来,您还可以使用lambda表达式而不是为您的类提供operator<。因此,您只需要下面两行代码就可以创建映射:

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
}
输出:


1: 43: 2
5: 6

Ideone上的代码