2016-06-21 4 views
0

Прежде всего, извините, если я задаю глупые вопросы, но я начинаю с C++.поиск элемента в мультимагере ТОЛЬКО с его значением C++

Я пишу систему, представляющую библиотеку, и есть функция-член моего класса библиотеки, которая должна позволить нам удалить книгу. Теперь, если книга заимствована пользователем, означает, что в моем _usersLoaningMultimap есть элемент (multimap<UserId,LoanInfo>). Как я могу найти LoanInfo, который я хочу, не зная ключа (UserId)?

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; 

}; 

ответ

0

Вы должны перебирать в целом Например:

for(multimap<userId,LoanInfo>::iterator it = _usersLoaningMultimap, it != _usersLoaningMultimap.end(); it++){ 
    //it->first retrieves key and it->second retrieves value 
    if(it->second == loan_info_you_are_searching){ 
     //do whatever 
    } 
} 
+0

большое спасибо! – adlsc

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

@adlsc Я испортил первое редактирование, возможно, вы захотите прочитать ответ еще раз. Если вы что-то не понимаете, укажите именно это. – Nelfeal