지도 기본값
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
'developer tip' 카테고리의 다른 글
IOS7, Segue 및 스토리 보드-버튼없이 만드는 방법? (0) | 2020.11.20 |
---|---|
IntelliJ Idea IDE에서 javafx.application 기호를 해결할 수 없습니다. (0) | 2020.11.20 |
Java InputStream 닫기 (0) | 2020.11.20 |
SpringJUnit4ClassRunner에 대한 log4j.properties를 구성하는 방법은 무엇입니까? (0) | 2020.11.20 |
SimpleXML 개체를 배열로 변환 (0) | 2020.11.20 |