如何将自定义对象插入到std::map中
How can I insert custom objects into a std::map?
我已经在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上的代码
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++如何创建 std::map
- 从其他容器中移动构造"std::map"
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- C++ 使用枚举类对象分配 std::map 值
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- std::map:当元素不可默认构造时创建/替换元素
- Arduino编译器和STL:使用std::vector和std::map