std :: map에 const 접근자가없는 이유는 무엇입니까?
std :: map의 [] 연산자에 대한 선언은 다음과 같습니다.
T& operator[] ( const key_type& x );
이것이 아닌 이유가 있습니까?
T& operator[] ( const key_type& x );
const T& operator[] const ( const key_type& x );
const 메서드에서 멤버 맵에 액세스해야 할 때마다 매우 유용하기 때문입니다.
operator[]in a map은 지정된 키의 값을 반환 하거나 아직 존재하지 않는 경우 해당 키에 대해 새로운 값 초기화 요소를 생성하므로 불가능합니다.
경우 operator[]것 const과부하, 요소를 추가하면 작동하지 않을 것입니다.
그것은 질문에 대한 답입니다. 대안 :
를 들어 C ++ 03 - 당신은 (이들은 반복자를 사용할 수 있습니다 const및 비 const결합 find). 에서 11 ++ C 당신이 사용할 수있는 at방법을.
C ++ 11 std::map::at부터는 const 및 non-const 액세스를 제공합니다.
반대로 요소가지도에 없으면 예외 operator[]가 std::out_of_range발생합니다.
이 대답은 operator[]키가 존재하지 않는 경우 키를 추가하는 의미가 있다는 점에서 정확 하지만 다른 관점을 추가하고 싶습니다.
공지 사항이 어떻게 operator[]다시 발생 T&. 즉, value에 연결된에 대한 참조를 반환합니다 key. 그러나에없는 key경우 map어떻게합니까? 무엇을 반환해야합니까? "널 참조"와 같은 것은 없으며 예외를 던지는 것은 성가시다.
이것은 안된다는 좋은 이유가 될 것 operator[] const입니다. map연산자가이므로 에 아무것도 추가 할 수 const없지만 존재하지 않는 항목을 찾고 있다면 사용자에게 무엇을 반환 할까요? 이 문제에 대한 좋은 해결책은 operator[] const.
(비 const) operator[]키가 없으면 생성합니다.
const해당 연산자 의 버전이 존재한다면 새 키를 추가 할 수 없기 때문에 다른 의미를 가져야합니다.
의미가 크게 다른 오버로드 를 갖는 const것과 const오버로드가없는 것은 웜이 될 수 있다는 데 동의 할 것 입니다. 따라서 const버전이 제공 되지 않습니다 .
find()하지만 const 멤버가 있으므로 코드에서 사용할 수 있습니다.
의 의미는 operator[]존재하지 않는 경우 키를 추가하기 때문입니다.
참고 URL : https://stackoverflow.com/questions/13902742/why-does-stdmap-not-have-a-const-accessor
'Program Club' 카테고리의 다른 글
| Android-새 이름으로 기존 프로젝트 복사 (0) | 2020.11.10 |
|---|---|
| C # : DateTime.Now Month 출력 형식 (0) | 2020.11.09 |
| 다차원 배열에서 데이터 파열 (0) | 2020.11.09 |
| Android Studio Gradle 문제 : OutOfMemoryError : PermGen 공간 (0) | 2020.11.09 |
| 여러 인수로 함수를 바인딩하는 AngularJS 지시문 (0) | 2020.11.09 |