2016-10-22 1 views
0

아마도 무언가를 매우 어리석은 짓을하고 있지만, findsuppID과 같은 키를 가진 요소를 찾지 못한 이유를 알 수 없습니다.C++ std :: map :: iterator는 아무것도 찾지 못했지만, 아래 첨자 연산자는 매핑 된 값에 대한 참조를 반환합니까?

그러나 아래 첨자 연산자 suppID을 전달하면 매핑 된 값에 대한 참조가 반환됩니다 (올바르게 찾았습니까?). std::map첨자 연산자를 사용할 때 아직 존재하지 않는 새로운 키 값에 대한 기본 값을 삽입하기 때문에

typedef std::map<SuppID, Supplement *> Supplement_t; 

Supplement_t::iterator it = supplements.find(suppID); //it = supplements.end() 

cout << "Supplement name: " << supplements[suppID]->getName() << endl; // "Cytogainer" 
... // Returns few of many other data members I tested... 
+2

'SuppID'는 복잡한 타입이고, 당신 자신의'<'를 작성했습니다. – Yakk

+0

@Yakk Correct. 그 팁은 나를 더 많이 읽게하고 모든 요소가 반사적으로 거짓으로 되돌아 갈 필요가 있음을 발견했습니다. 현재 그들은 그렇지 않습니다. 그래서 저는 그것이 실제로 문제라고 믿습니다. –

답변

1

연관 컨테이너에 <을 쓰면 쉽게 이해할 수 있습니다.

쉬운 방법은 튜플, 참조 또는 값 또는 혼합을 반환하는 함수 또는 메서드를 작성하는 것입니다. foo으로 전화하십시오. 당신이 틀린 <를 작성하는 경우

friend bool operator<(self const& lhs, self const& rhs){ 
    return lhs.foo()<rhs.foo(); 
} 

, 당신은 단순히 정신 나간 행동을 얻을 것이다.

2

있다고.

으로는 here 진술 :

1) VALUE_TYPE (키, T를()) 키가 존재하지 않는 경우 삽입합니다. 이 함수는 return insert (std :: make_pair (key, T()))와 같습니다. first-> second; -key_type은 CopyConstructible의 요구 사항을 충족해야합니다. -mapped_type은 CopyConstructible 및 DefaultConstructible의 요구 사항을 충족해야합니다. 삽입이 수행되면 매핑 된 값이 값으로 초기화되고 (클래스 유형에 대해 기본값으로 생성되고 그렇지 않으면 0으로 초기화 됨) 참조가 반환됩니다.

+0

필자도 역시 읽었지만 기본 생성자를 사용하여 요소가 생성 된 것처럼 보이지 않습니다. 그러므로'Supplement *'의'getName()'은''default protein shake ''대신''cytogainer''를 반환합니다. 매우 혼란. –

+0

@lololololol 글쎄, 그 좁은 표본에서 왜 그렇게되는지 판단 할 수는 없습니다. –