developer tip

지도

copycodes 2020. 11. 20. 09:05
반응형

지도 기본값


std::map<int,int> mapy;
++mapy[5];

mapy[5]항상 1 이라고 가정하는 것이 안전 합니까? 내가 할 말은 mapy[5]항상 내 코드와 같이 명시 적으로 선언하지 않더라도, '++'전에 0의 기본 가치를 얻을?


[] 연산자로 맵에 액세스하자마자 키가 존재하지 않으면 추가됩니다. int 유형의 기본 이니셜 라이저가 호출되어 0 값을 얻습니다.


예, 가정하는 것이 안전합니다.

지도 operator[]는 다음과 같이 지정됩니다. ([map.access])

효과 :x 지도 해당하는 키가없는 경우 지도에 삽입합니다 value_type(std::move(x), T()).
반환 값 : 받는 참조 mapped_type에 해당하는 x에서 *this.

T()사용 가치 초기화 모두 T제외 void ([expr.type.conv / 2)가치를 초기화 원시적 결과 제로 - 초기화 ([dcl.init] / 7) .

따라서 표현식은 값이 0 ([dcl.init] / 5) 인 객체에 대한 참조로 평가됩니다 .

operator++호출은 다음 하나 하나에 개체 및 평가합니다 증가시킨다.

(모든 참조는 C ++ 11입니다.)


예, 기본값이 해당 유형의 기본값이됩니다. 다른 기본값을 원하면 int처럼 동작하지만 다른 기본 생성자를 갖는 클래스를 만들 수 있습니다.


Rep_Movsd의 답변은 지나치게 단순화되어 있으며 매우 위험한 오해로 이어질 수 있습니다. C ++의 기본 데이터 유형에는 이니셜 라이저가 없습니다. Louis Brandy는 Facebook에서 자주 발생하는 많은 C ++ 오류와 std :: map <> [] 작동 방식에 대한 오해에 대해 논의한 멋진 강연을했습니다. 그가 논의한 오류 중 하나였습니다. std :: map <> []이 실제로 작동하는 방법에 대해 알아보십시오.

일반적으로 int는 초기화되지 않으며 모든 기본 유형처럼 정의되지 않습니다. 즉, std :: map <> []과 함께 사용할 때 int는 값 초기화라는 프로세스를 통해 설정된 기본값 0을 갖습니다. 값 초기화는 일반적으로 구조체와 실제로 작동하는 프로세스입니다. 예를 들어

struct Struct {
Struct() : memberVariable() {}
       int memberVariable;
};

항상 int를 0으로 초기화합니다. 멤버 변수가 다른 기본 유형이면 특정 초기화 값도 갖게됩니다. 예를 들어 다음과 같은 유형은 다음과 같은 값 초기화를 통해 초기화됩니다.

bool = false
float = 0.0f
enum = (enum type) 0
pointer = null pointer
pointer to member = null member pointer

명시 적으로 초기화되지 않은 데이터로 작업 할 때는 각별히주의하십시오. 마지막으로 다음 코드를 고려하십시오.

map<string, int> myMap;
cout << myMap["Foo"];

이 코드는 항상 정수를 0으로 초기화 할뿐만 아니라 0을 맵에 삽입합니다. 간단히 요약하자면 기본 데이터 유형은 초기화되지 않은 경우 정의되지 않지만 구조체 또는 맵 값 초기화와 같은 일부 인스턴스에서는 특정 값으로 기본 데이터를 초기화합니다.

참고 URL : https://stackoverflow.com/questions/2667355/mapint-int-default-values

반응형