다음 두 줄의 차이점은 무엇입니까?
map<int, float> map_data;
map<const int, float> map_data;
다음 두 줄의 차이점은 무엇입니까?
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>
and 사이의 차이 std::map<int, float>
는 어느 정도는 say 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
키 를 사용하려는 시도 는 작동하지 않습니다.
So the difference is largely invisible to you in every way that matters.
-키 (libc ++ 등)를 복사 / 이동하는 stdlib를 사용하지 않는 한,이 경우 const 버전이 중단됩니다. 관련 토론 은 목록 .cs.uiuc.edu / pipermail / cfe-dev / 2011-July / 015926.html 을 참조하십시오 .
키는 이미 const
그것을 쓸 중복하므로, const
이 경우. 한 번 입력 된 요소는 key
변경할 수 없습니다.
코멘트에서 언급 한 바와 같이,이 인 두 줄의 차이. 예를 들어를 받아들이는 함수를 작성하면 서로 다른 유형 이므로 map<const int, int>
전달할 수 없습니다 .map<int, int>
그러나 그들은 다른 유형이지만 맵의 키가 const
어쨌든 동일하기 때문에 동일하게 작동 합니다.
결론적으로 .. 유일한 차이점은 두 가지 유형이라는 것입니다. 다른 것은 신경 쓰지 말아야합니다.
key_type
여전히 사실이다 int
전자의 경우에.
차이점은 두 번째 변형은지도의 키 유형을로 설정한다는 것입니다 const int
. "수정 가능성"의 관점에서 볼 때 맵은 이미 키를 const
객체 로 저장하기 때문에 중복 됩니다.
그러나 이로 인해이 두 맵의 동작에서 예상치 못한 명백하지 않은 차이가 발생할 수도 있습니다. C ++에서 type 용으로 작성된 템플릿 전문화는 type 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>
둘 다에서 성공적으로 구축됩니다. 응용 프로그램의 동작은 변경되지 않습니다.
std::map::insert
여러 선언을하는 것에 대해 불평했습니다 .
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;
}
key_type
이다 const int*
, 포인터하지 CONST 자체를하지만 뾰족한는 int
CONST입니다.