仅在多重映射中找到一个元素及其值 c++
finding an element in a multimap ONLY with its value c++
首先很抱歉,如果我问的是愚蠢的问题,但我是 c++ 的初学者。
我正在编写一个代表图书馆的系统,我的图书馆 class 有一个成员函数应该允许我们删除一本书。现在,如果这本书是由用户借出的,则意味着我的 _usersLoaningMultimap
(multimap<UserId,LoanInfo>
) 中有一个元素。如何在不知道密钥(UserId)的情况下找到我想要的 LoanInfo?
bool Library::removeBook(const BookId& bookId){
//how to find my book in my library without knowing who loaned it.
}
为了说得更清楚,我的class图书馆是这样的:
class Library {
public:
Library();
void addUser(const UserId&, const string&);
Optional<string>& getUserInfo(const UserId& userId);
void addBook(const BookId& bookId, const string& description);
Optional<string>& getBookInfo(const BookId& bookId);
bool returnBook(const UserId& userId, const BookId& bookId);
void loanBook(const UserId& userId,LoanInfo& loan);
bool removeUser(const UserId& userId);
void getLoansSortedByDate(const UserId,std::vector<LoanInfo>& loanVector);
~Library() {}
private:
map<BookId, string> _bookMap;
map<UserId, string> _userMap;
multimap<UserId, LoanInfo> _usersLoaningMultimap;
};
std::multimap
不提供任何值查找方法。您唯一的选择是通读多图以查找特定值。
您可以使用 std::find_if 来达到这个目的:
using const_ref = std::multimap<UserId, LoanInfo>::const_reference;
std::find_if(_usersLoaningMultimap.begin(), _usersLoaningMultimap.end(),
[&](const_ref a) -> bool {
return a.second == your_loan_info;
});
如果你不喜欢语法,你也可以自己做函数:
using Map = std::multimap<UserId, LoanInfo>;
auto findLoanInfo(const Map& map, const LoanInfo& info) -> Map::iterator {
for (auto it = map.begin(); it != map.end(); ++it) {
if (it->second == info) {
return it;
}
}
return map.end();
}
您必须像这样遍历整个地图:
for(multimap<userId,LoanInfo>::iterator it = _usersLoaningMultimap.begin(); it != _usersLoaningMultimap.end(); it++){
//it->first retrieves key and it->second retrieves value
if(it->second == loan_info_you_are_searching){
//do whatever
}
}
首先很抱歉,如果我问的是愚蠢的问题,但我是 c++ 的初学者。
我正在编写一个代表图书馆的系统,我的图书馆 class 有一个成员函数应该允许我们删除一本书。现在,如果这本书是由用户借出的,则意味着我的 _usersLoaningMultimap
(multimap<UserId,LoanInfo>
) 中有一个元素。如何在不知道密钥(UserId)的情况下找到我想要的 LoanInfo?
bool Library::removeBook(const BookId& bookId){
//how to find my book in my library without knowing who loaned it.
}
为了说得更清楚,我的class图书馆是这样的:
class Library {
public:
Library();
void addUser(const UserId&, const string&);
Optional<string>& getUserInfo(const UserId& userId);
void addBook(const BookId& bookId, const string& description);
Optional<string>& getBookInfo(const BookId& bookId);
bool returnBook(const UserId& userId, const BookId& bookId);
void loanBook(const UserId& userId,LoanInfo& loan);
bool removeUser(const UserId& userId);
void getLoansSortedByDate(const UserId,std::vector<LoanInfo>& loanVector);
~Library() {}
private:
map<BookId, string> _bookMap;
map<UserId, string> _userMap;
multimap<UserId, LoanInfo> _usersLoaningMultimap;
};
std::multimap
不提供任何值查找方法。您唯一的选择是通读多图以查找特定值。
您可以使用 std::find_if 来达到这个目的:
using const_ref = std::multimap<UserId, LoanInfo>::const_reference;
std::find_if(_usersLoaningMultimap.begin(), _usersLoaningMultimap.end(),
[&](const_ref a) -> bool {
return a.second == your_loan_info;
});
如果你不喜欢语法,你也可以自己做函数:
using Map = std::multimap<UserId, LoanInfo>;
auto findLoanInfo(const Map& map, const LoanInfo& info) -> Map::iterator {
for (auto it = map.begin(); it != map.end(); ++it) {
if (it->second == info) {
return it;
}
}
return map.end();
}
您必须像这样遍历整个地图:
for(multimap<userId,LoanInfo>::iterator it = _usersLoaningMultimap.begin(); it != _usersLoaningMultimap.end(); it++){
//it->first retrieves key and it->second retrieves value
if(it->second == loan_info_you_are_searching){
//do whatever
}
}