2012-12-16 2 views
67

성병의 [] 연산자 :지도에 대한 선언이 무엇입니까?왜 std :: map에는 const 접근자가 없습니까?</p> <pre><code>T& operator[] (const key_type& x); </code></pre> <p>가이되지 않는 이유가 :

T& operator[] (const key_type& x); 
const T& operator[] const (const key_type& x); 

const 메소드의 멤버 맵에 액세스해야 할 때 언제나 유용하기 때문에.

+0

와우 남자, 당신은 주간 스택 교환 뉴스 레터에 그것을 만들었습니다 :) – xtofl

+0

Heheh, cool! Youguys는 멋진 답변을했습니다. – Calder

답변

79

operator[]지도에서 지정된 키의 값을 반환합니다. 또는은 아직 존재하지 않는 경우 해당 키에 대해 새로운 값 초기화 요소를 만듭니다. 따라서 불가능합니다.

const 오버로드가있는 경우 요소를 추가해도 작동하지 않습니다.

이렇게 대답합니다. 대안 :

03 C++ 용 - 당신이 반복자를 사용할 수있다 (이러한 constfind과 함께 비 const 있습니다). C++ 11에는 at 메서드를 사용할 수 있습니다.

4

의미가 있기 때문에 operator[]은 존재하지 않는 경우 키를 추가해야합니다.

6

(012-) operator[]이 없으면 키를 만듭니다.

해당 연산자의 버전이있는 경우 새로운 키를 추가 할 수 없으므로이 연산자의 버전이 다른 의미를 가져야합니다.

상당히 다른 의미를 가진 constconst 오버로드가 있으면 웜의 깡통 일 수 있다는 데 동의 할 것입니다. 따라서 const 버전이 제공되지 않습니다.

const find() 회원이 있으므로 코드에서 사용할 수 있습니다.

84

C++ 11에서 const 및 non-const 액세스를 제공하는 std::map::at이 있습니다.

operator[]과 대조적으로 요소가지도에없는 경우 std::out_of_range 예외가 발생합니다. 그 operator[]가 존재하지 않을 경우 키를 추가하는 의미를 가지고에

+5

_ 그레이트 추가. – xtofl

+0

foo.get (bar) -> second를 쓰는 것보다 훨씬 낫습니다. 감사합니다! =) – Calder

+6

foo가 bar를 키로 가진 항목을 이미 알고있는 경우를 제외하고는 @calder foo.find (bar) -> second ('get'이 아님)이 방금 깨졌습니다. 그렇지 않은 경우 역 참조가 아닌 반복자를 반환합니다. – boycy

16

이 답변은 정확하지만 다른 관점 추가 할 :

공지 방법 operator[] 리턴한다 T&합니다. 즉 key과 연결된 value에 대한 참조를 반환합니다. 그러나 mapkey이 없으면 어떻게 될까요? 우리는 무엇을 돌려야합니까? "null-reference"와 같은 것은 존재하지 않으며, 예외를 던지면 성가 시게됩니다.

이것은 operator[] const에 대한 하나의 좋은 이유입니다. map (연산자가 const이기 때문에)에 아무 것도 추가 할 수 없다면 사용자에게 무엇을 반환 하겠지만 존재하지 않는 항목을 찾고 있습니까?이 문제에 대한 좋은 해결책은 operator[] const이없는 것입니다.

+2

좋은 답변입니다. 아마 T & 대신 iterator를 반환한다면 std :: map은 const 접근자를 가질 수 있습니다. 하지만 그게 std :: map :: find()가하는 것입니다. 그것은 또한 성능이 현저하고별로 직관이 좋지 않을 것입니다. – vobject

+0

지도 객체에 'T null_' 멤버가 있고 그곳에 const 참조를 반환하지 않는 이유는 무엇입니까? – Inverse

+1

@Inverse :'null_'은 어떻게 초기화합니까? 예를 들어'T'가'int'이면? – Cornstalks

관련 문제