仅使用其值c ++在多图中查找元素

时间:2016-06-21 17:05:58

标签: c++ find multimap

首先对不起,如果我问愚蠢的问题,但我是c ++的初学者。

我正在编写一个代表库的系统,并且我的Library类的成员函数应该允许我们删除一本书。现在,如果图书由用户借出,则表示我的_usersLoaningMultimapmultimap<UserId,LoanInfo>)中有一个元素。如何在不知道密钥(UserId)的情况下找到我想要的LoanInfo?

bool Library::removeBook(const BookId& bookId){
//how to find my book in my library without knowing who loaned it.

}

为了更清楚,我的班级图书馆是这样的:

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;

};

2 个答案:

答案 0 :(得分:2)

你必须像这样迭代整个地图:

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
    }
}

答案 1 :(得分:0)

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();
}