2014-04-20 3 views
-2

작성자가 키이지만 어떻게 할 수없는지도에 개체를 배치하는 방법을 알아 내려고합니다.개체를 std :: map에 넣는 방법?

http://www.cplusplus.com/reference/map/map/insert/

경우 :

을 heres 생성자 여기

class Book 
{ 
public: 
string title = ""; 
string author = ""; 
int ISBN = 0; 

Book(string t, string a, int num) 
{ 
    title = t; 
    author = a; 
    ISBN = num; 
    if (ISBN < 1000 || ISBN > 9999) 
     throw ("Invalid ISBN"); 
    assert(ISBN > 1000 || ISBN < 9999); 
} 
}; 

및 내 클래스 객체는 벡터와지도

vector <Book> books; 
try 
{ 
    Book book1("a", "Jim John", 1001); 
    books.push_back(book1); 
    Book book2("b", "Jim John", 1002); 
    books.push_back(book2); 
    Book book3("c", "Billy Bill", 1003); 
    books.push_back(book3); 
    Book book4("d", "Greg Lumburge", 1004); 
    books.push_back(book4); 
    Book book5("e", "Dallas Orange", 1005); 
    books.push_back(book5); 
    Book book6("f", "Old McDonald", 1006); 
    books.push_back(book6); 
} 
catch (char*e) 
{ 
    cout << "invalid ISBN" << endl; 
    return(EXIT_FAILURE); 
} 

    map<string, Book> authorMap; 

for (auto x : authorMap) 
    cout << x.first<< " : "<< x.second << endl; 
+2

그래서 코드에 어떤 문제가 있습니까? – riklund

+0

아직 내 벡터로 채울 때까지 아무 것도 시도하지 않으면 일치하지 않는다고 말하기 시작합니다. (Book b : books) {++ authorMap [b];} – user3549747

+1

키는 고유해야합니다 (cf "짐 존"). 그렇지 않으면 std :: multimap을 고려하십시오. 또한 [] 연산자는 키 유형을 인수로 사용합니다 (도서가 아닌 케이스의 문자열 유형). – SleuthEye

답변

1

이와 같이 삽입 API를 사용해보세요.

authorMap.insert ("Dallas Orange",book5); 

authorMap.insert ("Jim John", Book ("a", "Jim John", 1001)); 

및 작성자를 사용하여 도서 개체에 액세스하거나 그 반대로 반복자를 사용할 수 있습니다.

0

지도에 대한 설명서를 참조하십시오이다 귀하의 유스 케이스, 당신은 할 수 :

std::map<string,Book> authorMap; 
Book book("a", "Jim John", 1001); 
authorMap.insert (std::pair<string,Book>(book.author,Book)); 
+1

-1 : 지원 설명이없는 링크 전용 답변은별로 도움이되지 않으므로 대부분 답글로 게시해야합니다. –

+0

@PaulR - 답변이 업데이트되었습니다. – csvan

+0

감사의 결과 - 투표가 삭제되었습니다. –

0

그래서 벡터에서지도를 채우고 싶습니다. 그래도 할 수있어

for_each(books.begin(), books.end(), [&authorMap] (Book & b) { authorMap[b.author]=b; }); 

'포함 # < 알고리즘>'을 잊지 마세요. 당신은 람다에 새로운 (또는 ++ 11 C를 사용하지 않는) 경우

,이

같은 일이
for(vector<Book>::const_iterator it = books.begin(); it!=books.end(); ++it) 
{ 
    authorMap[it->author] = *it; 
} 
또한 솔루션은 하나 개의 저자가이 경우에 문제가 될 것이라고 지적한다

한 권 이상의 책을 썼다.

+0

첫 번째 또는 두 번째 발췌 문장의 경우? – riklund

0

지도는 쌍의 모음입니다. 따라서지도에 무언가를 삽입하려면 먼저 쌍으로 만들어야합니다. 아래의 예를 참조하십시오 :

std::map<char, int> charIntMap; 
std::pair<char, int> charIntPair('a', 65); 

charIntMap.insert(charIntMap.end(), charIntPair); 
charIntMap.insert(charIntMap.end(), std::pair<char, int>('b', 66)); 

지금, 맵에 무언가를 삽입하는 또 다른 방법은 [] 연산자를 활용하는 것입니다. 다음과 같이 표시됩니다.

charIntMap['c'] = 67; 
관련 문제