ProgramingTip

const 키와 non const 키의 차이점은 무엇입니까?

bestdevel 2020. 11. 8. 10:37
반응형

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. "수정 가능성"관점에서 볼의 때 맵은 이미 키를 constobject- 로 저장하기 때문에 중복 됩니다.

그러나 이로 인해 두 맵의 동작에서 예상치 명백하지 않은 차이가 있습니다. 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

반응형