const 키와 non const 키의 차이점은 무엇입니까?
다음 두 줄의 차이점은 무엇입니까?
map<int, float> map_data;
map<const int, float> map_data;
int
그리고const int
두 가지 종류가 있습니다.std::map<int, float>
와std::map<const int, float>
, 다른 유형입니다.
std::map<const int, float>
와 사이의 차이 std::map<int, float>
는 어느 정도는 말할 std::map<int, float>
와 사이의 차이와 유사합니다 std::map<std::string, float>
. 각각에 대해 새로운지도 유형을 얻습니다.
const
오는가 않은 경우 내부 키 유형 은 여전히 const
int
다음과 같습니다.
std::map<const int, float>::key_type => const int
std::map<int, float>::key_type => int
그러나 맵 키는 의미 상 불변이며 키에 대한 직접 액세스를 허용하는 모든 맵 작업 (예 : 를 수행하는 역 참조 반복자 value_type
)은 다음을 수행 const
합니다 key_type
.
std::map<const int, float>::value_type => std::pair<const int, float>
std::map<int, float>::value_type => std::pair<const int, float>
따라서 구현에서 허용하는 경우 중요한 모든 방식에서 차이 가 거의 보이지 않을 수 있습니다.
하지만 항상 그런 것은 아닙니다. 표준은 공식적으로 키 유형을 복사 및 이동 가능하도록 요구하고 일부 구현에서는 맵 노드를 보충합니다 . 구현에서 이러한 const
키 를 사용하려는 시도 는 작동하지 않습니다.
키는 이미 const
그것을 사용하여 쓸 때, const
이 경우. 한 번 입력 된 요소는 설명 key
수 없습니다.
편집 :
코멘트에서 언급 한 바와 같이,이 인 두 줄의 차이. 예를 들어를 받아들이는 함수를 작성하면 서로 다른 유형 때문에 이기
map<const int, int>
때문에 수 없습니다 .map<int, int>
그들은 다른 유형 그러나이지만 맵의 키가 const
어쨌든 동일하기 때문에 동일하게 작동 합니다.
결론적으로 .. 유일한 차이점은 두 가지 유형이라는 것입니다. 다른 것은 신경 쓰지 말아야합니다.
차이점은 두 번째 변형은지도의 키 유형을로 설정한다는 것입니다 const int
. "수정 가능성"관점에서 볼의 때 맵은 이미 키를 const
object- 로 저장하기 때문에 중복 됩니다.
그러나 이로 인해 두 맵의 동작에서 예상치 명백하지 않은 차이가 있습니다. C ++에서 유형 T
에 대해 얘기 템플릿 전문화는 유형 에 대해 전문화와 const T
. 즉, 위의 두 버전의지도는 키 유형에 따라 다양한 "위성"템플릿의 다른 전문화를 사용하게 될 수 있습니다. 한 가지 예는 키 비교기 술어입니다. 첫 번째 std::less<int>
는 사용 하고 두 번째는 std::less<const int>
. 이 차이를 활용하면 맵을 쉽게 다른 순서로 요소를 이용할 수 있습니다.
이와 같은 문제는 std::unordered_map
. 키 해싱을 위해 특수화 std::unordered_map<const int, int>
를 사용하려고 시도하기 때문에 노력하지 않습니다 std::hash<const int>
. 표준 라이브러리에 존재하지 않습니다.
const
한 번 설정하면 설명 수 없습니다. 그리고 예, 문서 및 기타 답변 key
에 따라 const
이미 기억해야합니다 .
링크 : http://www.cplusplus.com/reference/map/map/ 링크 : http://en.cppreference.com/w/cpp/container/map
응용 프로그램의 동작은 일반적으로 동일하지만 사용할 수있는 일부 컴파일러에 차이가 있습니다. 이 페이지를 처음으로 된 구체적인 예는 다음과 방문 할 수 있습니다.
map<const key, value>
GNU을 사용하여 툴킷 성공적 으로 빌드 된 맵을 명시 적으로 지정합니다 .
그러나 Studio12 Solaris x86 빌드가 충돌합니다.
map<key, value>
둘 다에서 확장됩니다. 응용 프로그램의 동작은 변경되지 않습니다.
Const 키는 키가 포인터 인 경우 유용 할 수 있습니다. const 키를 사용하면 키에 액세스 할 때 뾰족한 개체를 사용할 수 없습니다. 다음을 고려하세요.
#include <map>
#include <string>
int glob = 10;
int main() {
std::map<const int*, std::string> constKeyMap { { &glob, "foo"} };
std::map<int*, std::string> keyMap { { &glob, "bar" } };
for(const auto& kv : keyMap) { *(kv.first) = 20; }; // glob = 20
for(const auto& kv : constKeyMap) { *(kv.first) = 20; }; // COMPILE ERROR
return 0;
}
const는 한 번 정의에 대한 설명 수없는 상수를 나타냅니다. const가 아닌 키는 변경 될 수 있습니다 ... 또는 사용할 수 없습니다. const (한 번 정의 된 경우)에서 "변경 없음"이 보장됩니다. , 그리고 "변경"은 비 const 항목에서 발생하거나 발생하지 않을 수 있습니다.
참고 URL : https://stackoverflow.com/questions/17638154/what-is-difference-between-const-and-non-const-key
'ProgramingTip' 카테고리의 다른 글
L1 캐시 미스 비용은 얼마입니까? (0) | 2020.11.08 |
---|---|
std :: string을 파일에 쓰는 방법? (0) | 2020.11.08 |
Bash의 텍스트 파일에서 배열 만들기 (0) | 2020.11.08 |
콘솔에 인쇄 된 것을 잘리지 마십시오 (RStudio에서). (0) | 2020.11.08 |
C ++에서 부울에 비트 연산자 사용 (0) | 2020.11.08 |