2016-06-21 18 views
0

Zunächst einmal Entschuldigung, wenn ich dumme Fragen stelle, aber ich bin ein Anfänger in C++.NUR ein Element in einer Multimap finden mit seinem Wert C++

Ich schreibe ein System, das eine Bibliothek darstellt, und es gibt eine Memberfunktion meiner Bibliotheksklasse, die es uns ermöglichen soll, ein Buch zu entfernen. Wenn das Buch nun von einem Benutzer ausgeliehen wird, bedeutet dies, dass sich ein Element in meinem _usersLoaningMultimap (multimap<UserId,LoanInfo>) befindet. Wie kann ich die gewünschte LoanInfo finden, ohne den Schlüssel zu kennen (UserId)?

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

}

Nur um es klarer, meine Klassenbibliothek ist wie folgt aus:

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; 

}; 

Antwort

0

Sie haben durch die ganze iterieren karte wie folgt:

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

vielen Dank! – adlsc

0

std::multimap bietet keine Methode für Wert-Lookup. Ihre einzige Wahl besteht darin, die Multimap nach einem bestimmten Wert zu durchsuchen.

Sie std::find_if zu diesem Zweck verwenden können:

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

Wenn Sie die Syntax nicht mögen, können Sie auch Ihre eigene Funktion machen:

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 Ich vermasselt die erste Bearbeitung, möchten Sie vielleicht die Antwort erneut lesen. Wenn du etwas nicht verstehst, zeige es genau an. – Nelfeal