map<string, string> dada;
dada["dummy"] = "papy";
cout << dada["pootoo"];
정의되지 않은 동작으로 간주되는지 여부, 존재하지 않는 키를 요청할 때 어떻게 알 수 있는지 모르기 때문에 당황합니다. 대신 find를 사용합니까?
답변:
map::operator[]
값에 대한 데이터 구조는 소정의 키에 대응하는 검색 결과, 복귀에 대한 참조.
찾을 수없는 경우 기본 생성 요소를 투명하게 만듭니다. (이 동작을 원하지 않는 경우 map::at
대신 함수를 사용할 수 있습니다 .)
std :: map 메서드의 전체 목록은 여기에서 얻을 수 있습니다.
http://en.cppreference.com/w/cpp/container/map
다음은 map::operator[]
현재 C ++ 표준 의 문서입니다 .
T& operator[](const key_type& x);
효과 : 맵에 x에 해당하는 키가 없으면 value_type (x, T ())을 맵에 삽입합니다.
요구 사항 : key_type은 CopyConstructible이고 mapping_type은 DefaultConstructible입니다.
반환 값 : * this의 x에 해당하는 mapping_type에 대한 참조.
복잡성 : 대수.
T& operator[](key_type&& x);
효과 : 맵에 x에 해당하는 키가 없으면 value_type (std :: move (x), T ())을 맵에 삽입합니다.
요구 사항 : mapping_type은 DefaultConstructible이어야합니다.
반환 값 : * this의 x에 해당하는 mapping_type에 대한 참조.
복잡성 : 대수.
ISO/IEC 14882:2011(E)
있습니까?
key value
using 인덱스 연산자 에 액세스하려고하면 []
다음 두 가지가 발생할 수 있습니다.
key
. 따라서 해당 key value
.key
. 이 경우 자동으로 key
를 사용하여지도에 추가합니다 null value
."pootoo"
지도에 키가 없습니다. 그래서 자동으로 추가됩니다 key
와 value = ""
(빈 문자열). 그리고 프로그램은 빈 문자열을 인쇄합니다.
여기에서지도 크기가 1
.
키를 검색하려면를 사용할 수 있습니다 . 키가 없으면 map_name.find()
반환 map_name.end()
됩니다. 그리고 더 이상 추가되지 않습니다 key
.
[]
키 값을 설정하고자 할 때 연산자 를 사용할 수 있습니다 .
operator[]
에 대한 map
반환이 아닌 const를 참조 당신은 방법으로 당신이 당신의 두 번째 줄에 표시 한 것을 사용하여 지정할 수 있습니다. 이러한 방식으로 액세스하면 기본 구성 요소 value
유형 이 생성됩니다 .
요소를 찾고 싶다면 더 나은 방법은
iterator find ( const key_type& x )
(또는 const 대안) <map>.end()
키를 찾지 못하거나 컬렉션에 있는지 알고 싶다면 사용할 수있는 것과 동일한 반복자를 반환합니다.
size_type count ( const key_type& x ) const
키가 고유하므로 맵에 대해 항상 1 또는 0을 반환합니다.
연산자 []가 제공된 키에 대한 값을 찾지 못하면 해당 위치에 하나를 삽입합니다.
그러나 를 방문하여 not exist key
mapKV [not_exist_key] .member_fun ()과 같은 멤버 함수를 호출하면 프로그램이 중단 될 수 있습니다.
다음과 같이 예제, 테스트 클래스를 제공하겠습니다.
struct MapValue{
int val;
MapValue(int i=0){
cout<<"ctor: "<<i<<endl; val = i;
}
~MapValue(){
cout<<"dtor: "<<val<<endl;
}
friend ostream& operator<<(std::ostream& out, const MapValue& mv){
cout<<"MapValue: "<<mv.val<<endl;
}
string toString(){
cout<<"MapValue: "<<val<<endl;
}
};
테스트 코드 :
cout<<"-------create map<int, MapValue>-------"<<endl;
map<int, MapValue> idName{{1, MapValue(1)}, {2, MapValue(2)}};
cout<<"-----cout key[2]-----"<<endl;
cout<<idName[2]<<endl;
cout<<"-----cout key[5]-----"<<endl;
cout<<idName[5]<<endl;
cout<<"------- runs here means, does't crash-------"<<endl;
아래와 같이 출력 :
-------create map<int, MapValue>-------
ctor: 1
ctor: 2
dtor: 2
dtor: 1
dtor: 2
dtor: 1
-----cout key[2]-----
MapValue: 2
-----cout key[5]-----
ctor: 0
MapValue: 0
-------runs here means, does't crash-------
dtor: 0
dtor: 2
dtor: 1
우리는 그것을 볼 수 있습니다 : idName에 삽입하기 idName[5]
위해 map 구조 {5, MapValue(0)}
를 호출합니다 .
그러나으로 멤버 함수를 호출 idName[5]
하면 프로그램이 충돌합니다.
cout<<"-------create map<int, MapValue>-------"<<endl;
map<int, MapValue> idName{{1, MapValue(1)}, {2, MapValue(2)}};
idName[5].toString(); // get crash here.
cout<<"------- runs here means, doesn't crash-------"<<endl;
out_of_range 예외를 확인하십시오 : http://www.cplusplus.com/reference/stdexcept/out_of_range/
이것이 key가 존재하지 않으면 map :: at과 map :: operator []가 던지는 것입니다. 링크의 벡터 예제와 같은 방식으로 잡을 수 있습니다.
http://www.cplusplus.com/reference/map/map/find/를 사용할 수도 있습니다.
그리고 map :: end를 확인하십시오.