2010-01-08 4 views
5

지도에이 동일한 키를 여러 번 삽입하려고했지만 값이 다릅니다. 작동하지 않습니다. 나는 operator []가이 작업을 수행한다는 것을 알고 있지만, insert의이 동작이 맞다면 나의 질문은 무엇입니까? insert()하지 말아야합니까? 나는 어떤 표준이 말하는지 궁금해. 불행히도 나는 그것을 (표준 C++에 대한) 그래서 내가 확인할 수 없습니다.
도움이되는 ansers에 감사드립니다.왜 std :: map에서 insert를 업데이트하지 않으시겠습니까? [C++]

답변

14

대신 std::multimap이 필요합니다.

키가 이미 존재하는 경우 std::map::insert은 아무 작업도 수행하지 않습니다. std::map::operator[]은 이전 값을 덮어 씁니다.

STL 참조의 경우 C++ 표준 자체가 필요하지 않습니다. http://www.cplusplus.com/reference/ 같은 것도 할 것입니다.

+0

감사합니다. 적어도 15 자 이상이어야하므로이 텍스트를 입력합니다. –

5

나는 완전히 이해하고 있는지 확신 할 수는 없지만 맵에서 이전 항목을 덮어 쓰는 것처럼 들립니다. map은 키당 값을 으로 저장합니다.

대신에 multi_map을 사용해야합니다. 이렇게하면 같은 값으로 다른 키를 삽입 할 수 있습니다. 너는 operator[]을 이렇게 잃는다. 왜냐하면 그것은 실제로 의미가 없기 때문이다. (., 확실히 삽입하지만 운영자는 검색 할 때 어떤 값이 검색해야합니까?)

여기 (here에서 수정) 예 : 당신이 다른 값과 동일한 키를 삽입 할 경우

#include <iostream> 
#include <map> 

int main(void) 
{ 
    std::multimap<std::string, int> m; 

    m.insert(std::make_pair("a", 1)); 
    m.insert(std::make_pair("b", 2)); 
    m.insert(std::make_pair("c", 3)); 
    m.insert(std::make_pair("a", 4)); 
    m.insert(std::make_pair("b", 5)); 
    m.insert(std::make_pair("a", 6)); 

    std::cout << "Number of elements with key a: " << m.count("a") << endl; 
    std::cout << "Number of elements with key b: " << m.count("b") << endl; 
    std::cout << "Number of elements with key c: " << m.count("c") << endl; 

    std::cout << "Elements in m: " << endl; 
    for (m::iterator it = m.begin(); it != m.end(); ++it) 
    { 
     std::cout << " [" << it->first << ", " << it->second << "]" << endl; 
    } 
} 
관련 문제