如何在映射中返回null

How to return null in map?

本文关键字:返回 null 映射      更新时间:2023-10-16

如果accountNo找不到map,我将尝试返回null。但我过去只在java中使用过linkedlist。我不知道如何在c++映射中返回其他内容。

113 Account Bank::BalanceEnquiry(long accountNo){
114         map<long, Account>::iterator itr = accounts.find(accountNo);
115         return itr->second;
116 }       

有人能帮忙吗?

您可以使用std::optional,它是一个可能包含也可能不包含值的包装器:

std::optional<Account> Bank::BalanceEnquiry(long accountNo){
auto itr = accounts.find(accountNo);

if(itr == accounts.end()) {
return std::nullopt; // empty value, that's like null from Java
}
return std::optional<Account>{itr->second}; // return non-empty value
}  

它可以这样使用(与Bank-对象myBank一起使用(:

std::optional<Account> balanceEnquiry = myBank.BalanceEnquiry(someValue);
if(balanceEnquiry) {
// entry found, we can extract the actual value
Account foundAccount = balanceEnquiry.value();
}
else {
// entry not found
}

与C++中的Java不同,您可以通过值(或引用(或指针返回对象。如果按值返回(如代码中所示(,则除非classAccount具有特殊状态,否则无法返回nullptr。所以您必须更改返回类型。可能的变体:

// return a pointer
Account *Bank::BalanceEnquiry(long accountNo){
auto itr = accounts.find(accountNo);
return itr == accounts.end() ? nullptr : &(itr->second);
}
// usage
auto account = bank.BalanceEnquiry(123);
if( account ) account->do_something();
// return std::optional
std::optional<Account> Bank::BalanceEnquiry(long accountNo){
auto itr = accounts.find(accountNo);
return itr == accounts.end() ? std::optional<Account>() : itr->second;
}
// usage
auto account = bank.BalanceEnquiry(123);
if( account ) account.value().do_something();