仅在多重映射中找到一个元素及其值 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
    }
}