我已经在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;
}
答案 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