如何在 C++ 中的 map STL 中将键作为类插入
Posted
技术标签:
【中文标题】如何在 C++ 中的 map STL 中将键作为类插入【英文标题】:How can I insert key as a class in map STL in C++ 【发布时间】:2016-08-01 06:50:01 【问题描述】:下面的程序有什么问题,为什么我不能用类作为键来初始化地图
#include <iostream>
#include <map>
#include <utility>
using namespace std;
class User
int value_1;
int value_2;
public:
User( int num_1, int num_2)
value_1 = num_1;
value_2 = num_2;
int getId()
return value_1;
int getUid()
return value_2;
bool operator< (const User& userObj) const
if(userObj.value_1 < this->value_1)
return true;
;
int main()
std::map<User, int> m_UserInfoMap;
m_UserInfoMap.insert(std::make_pair<User, int>(User(1,2), 100) );
m_UserInfoMap.insert(std::make_pair<User, int>(User(3,4), 120) );
m_UserInfoMap.insert(std::make_pair<User, int>(User(5,6), 300) );
std::map<User, int>::iterator it = m_UserInfoMap.begin();
for(; it != m_UserInfoMap.end(); it++)
std::cout<<it->first.getId()<<" :: "<<it->second<<std::endl;
return 0;
在上面的程序中,如果我尝试将键添加为类,则会出错。 并请告诉不同的方式来初始化地图。
【问题讨论】:
如果我尝试初始化地图,例如:m_UserInfoMap[a] = 1;它工作正常”但是如果 std::mapstd::map
的value_type
是std::pair<const Key, T>
,表示密钥保存为const
。所以你不能像std::cout<<it->first.getId()
这样对它们调用非常量成员函数。
您应该将 User::getId()
(和 User::getUid()
)更改为 const 成员函数。如:
int getId() const
// ~~~~~
return value_1;
int getUid() const
// ~~~~~
return value_2;
顺便说一句:当if
条件在operator<
中失败时,您没有返回任何内容。
bool operator< (const User& userObj) const
if(userObj.value_1 < this->value_1)
return true;
else
return false; // return for else case
或者只是
bool operator< (const User& userObj) const
return userObj.value_1 < this->value_1;
【讨论】:
if(condition) return true; else return false;
风格不好,最好不要显示这样的东西...
@Aconcagua 我同意这一点。我想强调 OP 也应该为隐含的 else 情况返回 sth。反正我最后写了一个最简单的。 :)【参考方案2】:
首先,你应该让你的操作符总是返回一个值:
bool operator< (const User& userObj) const
return userObj.value_1 < this->value_1;
您确定要将x < y
与y.value < x.value
进行比较吗?否则,你需要改变里面的比较:
bool operator< (const User& userObj) const
return this->value_1 < userObj.value_1;
而且在写这个答案的时候,宋元瑶第二部分的速度比我快,所以看看他的答案……
【讨论】:
以上是关于如何在 C++ 中的 map STL 中将键作为类插入的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义类类型作为键的 C++ unordered_map
使用自定义类类型作为键的 C++ unordered_map
使用自定义类类型作为键的 C++ unordered_map