- 此问题在此处已有答案**:
C++ map with custom key(2个答案)
1小时前关闭。
我创建了两个类:Bank
和Account
。
我想使用std::map<Bank, Account> bankAccount
,如下所示:
bankAccount.insert(std::make_pair(bank1, account1));
但是我得到了几个编译时错误。
我知道如何使用map<int, Bank>
或map<int, Account>
,但不知道map<Bank, Account>
。我假设问题在于告诉编译器如何确保我的Bank
对象是唯一的,并且由于C++中的Map是有序的,我需要告诉编译器如何排序库。如果键碰巧是整数,这对编译器来说没有问题。
我的班级如下:
class Bank {
public:
// Constructors
Bank() = default;
Bank(std::string name, std::string created, int balance, bool active)
: m_name(std::move(name)), m_created(std::move(created)), m_balance(balance), m_active(active) {};
// Member functions
void deposit(int amount) {
m_balance += amount;
}
[[nodiscard]] int getBalance() const {
return m_balance;
}
void setBalance(int amount) {
m_balance = amount;
}
// Member attributes
std::string m_name;
std::string m_created;
int m_balance{};
bool m_active{};
};
class Account {
public:
// Constructor
Account() = default;
Account(std::string name, int balance){
m_name = name;
m_balance = balance;
}
//Member functions
void displayBalance() const {
std::cout << m_name << ": " << m_balance << std::endl;
}
// Member attributes
std::string m_name;
int m_balance{};
};
银行对象的创建过程如下:
Bank bank1("FirstBank", "2015-01-01", 1000, true);
帐户对象的创建过程如下:
Account account1("Dining", 10000);
有人能告诉我如何使用Bank
类作为std::map
的键吗?
我尝试在Bank
类中重载operator<()
,如下所示,但这没有解决我的问题:
bool operator<(Bank& other) {
return m_name < other.m_name && m_created < other.m_created \
&& m_balance < other.m_balance && m_active < other.m_active;
}
从std::map
切换到std::unordered_map
也不能消除编译时错误。
1条答案
按热度按时间w46czmvw1#
为你的
Bank
类重载operator<
是正确的解决方案,但是你的实现是错误的,这将导致编译时错误,更糟的是在运行时导致 * 未定义的行为 *。试试类似这样的方法:
或者:
无论哪种方式,通过将值
std::tie()
'在一起可以大大简化运算符的实现,因为std::tie
已经实现了operator<
,例如:或者: