将自定义对象插入std :: map

时间:2011-11-21 23:37:24

标签: c++

我已经在Cplusplus.com上阅读了map :: 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;
 }

3 个答案:

答案 0 :(得分:2)

我没有看到您的代码有任何问题,除了bool运算符应该是友元方法(它甚至没有友好关键字编译):

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 a triSpecObject3。

答案 1 :(得分:0)

看起来它不会编译 - 您的operator<在所有情况下都不会返回值。 (编辑:你已修好了,谢谢。)你可以简化它:

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

由于您没有显示插入地图的完整代码,因此无法说明为什么返回值.second始终返回true。

答案 2 :(得分:0)

C++11起,您也可以使用lambda expression代替为班级提供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:4
  3:2
  5:6

Code on Ideone