2009-02-03 2 views
43

나는 이런 std::map 있습니다STL 맵은 삽입시 기본 유형을 초기화합니까?

map<wstring,int> Scores; 

그것은 플레이어와 점수의 이름을 저장합니다. 이 일을 만듭니다 키 wstrPlayerName와 맵에 요소가없는 경우

Scores[wstrPlayerName]++; 

을하지만, 증가하기 전에 제로 또는 null로 초기화 않거나 정의되지 않은 남아있다 : ​​누군가가 점수를 얻을 때 나는 간단하게 할 것 ?

증가 할 때마다 요소가 존재하는지 테스트해야합니까?

답변

61

연산자 [] 외모 : 당신은지도에 아직입니다 로 호출하면

Value& map<Key, Value>::operator[](const Key& key); 

, 그것은, 의 새로운 인스턴스를 기본-구축에 넣어 것입니다 키를 입력하면 참조가 반환됩니다. 이 경우에, 당신이있어 : 여기

map<wstring,int> Scores; 
Scores[wstrPlayerName]++; 

가치 INT, 당신은 INT()로 초기화 것처럼의 int는 기본적으로 구축 0과 같다. 다른 기본 유형이 유사하게 초기화된다 (예를 들어 더블 , ()를, 긴(), 불리언() 등).

결국 코드는지도에 새로운 쌍 (wstrPlayerName, 0)을 넣은 다음 int에 대한 참조를 반환합니다.이 참조는 증가합니다. 따라서 요소가 0부터 시작하기를 원한다면 아직 테스트 할 필요가 없습니다.

11

기본값으로 새 인스턴스 value이 생성됩니다. 정수의 경우 기본 구성은 0이므로 의도 한대로 작동합니다. 이 같은

+1

정수의 경우 기본 * construction *은 실제로 문제가 아닙니다. 기본 * 초기화 *는 고정되어 있지 않으면 초기화되지 않습니다. Maps * value * -initialize 요소는 정수의 경우 0을 초기화하는 이유입니다. – juanchopanza

5

증가하기 전에 항목이 존재하는지 테스트해서는 안됩니다. [] 연산자는 다른 사람이 말했듯이 여러분이 필요로하는 것과 정확히 일치합니다.

하지만 기본 구성 값이 작동하지 않으면 어떻게해야합니까? 귀하의 경우에는 요소가 이미 존재하는지 확인하는 가장 좋은 방법은 그것을 삽입하는 것입니다. std::mapinsert 멤버 함수는 std::pair<iterator, bool>을 반환합니다. 삽입이 성공하든 실패하든간에 쌍의 첫 번째 요소는 원하는 개체 (새 개체 또는 이미 존재 한 개체)를 가리 킵니다. 그런 다음 적절하게 값을 변경할 수 있습니다.

4

도움 주셔서 감사합니다.

은 그래서 표준 : :지도는 내가 만들 때 원시 형 일들이 항상 정의되지 생각했기 때문에 난 그냥 궁금 0

자신의 원시적 인 형태의 값을 설정합니다.

내가 좋아하는 뭔가를 작성하는 경우 : 컴파일러는 내가 정의되지 않은 내게 경고

int i; 
i++; 

을 내가 프로그램을 실행할 때 일반적으로 0이 아닌.

+7

사실 그것은 C++ 언어의 기능입니다. std :: map과 같이 int의 생성자 (int i = int())를 명시 적으로 호출하면 0으로 초기화됩니다. 벌거 벗은 int는 아직 초기화되지 않습니다. –

+2

실제로 "int i;" int (클래스 유형과 달리)를 기본값으로 초기화하지 않습니다. 그 값은 정의되지 않은 채로 남을 것이다. 같은 : struct a {int i; }; << i 값은 정의되지 않았습니다. 구조체 {a() : i() {} int i; }; << 값이 0입니다. –

+0

잠시만 요. struct A {int i; }; 그런 다음 A 유형의 객체를 만듭니다. A myA = A(); A()를 호출하거나 사용하면 myA 전체가 0으로 초기화되므로 myA.i는 0이되므로 0이됩니다. 참조 http://en.cppreference.com/w/cpp/language/zero_initialization – Will

1

초기화 규칙을 확인하십시오.

"4.9.5 C++ Prog Lang 또는 C++ std book 초기화"단원을 참조하십시오. 변수가 지역 변수, 정적 변수, 사용자 정의 변수 또는 const 기본 초기화인지 여부에 따라 다릅니다.

당신의 경우 int는 POD (Plain old Datatype)라고합니다. 자동 (힙/로컬 변수에 생성 됨) POD 변수는 기본값으로 초기화되지 않습니다. 따라서 위의 "i"는 값이 0이 아닙니다.

힙에 정의 할 때 항상 POD를 초기화하는 습관을 만드십시오. int()를 사용하여 값을 초기화 할 수도 있습니다.

+3

당신이 POD에 대해 말한 것은 정확 합니다만, OP는 std :: map에 의해 수행 된 초기화에 대해 묻습니다. 귀하의 답변은 적용되지 않으며 다른 답변과 모순되는 것처럼 독자에게 혼동을 줄 수 있습니다. – MatthewD

+0

좋아요, 당신의 대답은 실제로 @ Calmarius의 답변에 응답하고 있습니다. 지금은 ** 아래 ** (** ** 이상 **)입니다. 이것은 정말로 별도의 답변이 아니라 주석이되어야합니다. – MatthewD

+0

게시 된 질문에 대한 답변으로, 이것은 완전히 잘못되었습니다. – juanchopanza

관련 문제