2016-06-13 9 views
1

나는 일치하는 m1[0]이 할당 되었는가 알고 싶다. 나는이 방법으로 시도하고 올바른 것으로 보이는 "1"을 출력한다. 그것을하는 적당한 방법일까요? 아니면 더 좋은 해결책입니까?일치하는지도가 있는지 확인하는 방법은 무엇입니까?

int main(int argc, char const *argv[]){ 
    map<int, char> m1; 
    //cout << m1[0] << endl; 
    if(m1[0] == NULL) cout << "1" << endl; 
    else cout << "0" << endl; 
} 
+0

의 사용 가능한 복제 [키가 존재하지 않는 경우 왜 표준 : :지도 연산자는 \ [\] 객체를 생성합니까?] (http://stackoverflow.com/questions/1639544/why-does- stdmap-operator-create-an-object-if-the-key-doesnt-exist) – Viatorus

답변

3

키의 존재를 확인하지 않고 키에 매핑 된 값이 NULL (즉, char의 경우 '\0')인지 확인하는 중입니다.

auto it = m1.find(0); 
if (it != m1.end()) std::cout << "0: " << it->second << "\n"; 
else cout << "Not found." << endl; 

을 그리고 키가 존재하지 않는 경우 std::map::operator[]value_type 개체를 삽입 않습니다 :

당신은 std::map::find를 사용해야합니다. 이 경우 값은 value-initialized이고 char 일 때 0으로 초기화됩니다 (예 : '\0'). 따라서 m1[0]은 처음에 삽입을 수행하고 m1[0] == NULLtrue을 반환하므로 코드가 올바른 것 같습니다.

+0

알았어. 감사합니다 –

+0

@Vincent_Bryan 대단합니다. – songyuanyao

2

m1.find(key)을 사용하면 결과가없는 경우 m1.end()을 반환합니다.

게다가 m1[key] 대신 m1.at(key)을 사용할 수 있으며 이러한 요소가없는 경우 std::out_of_range 예외가 발생합니다.

1

다른 말로, map :: find 또는 map :: at를 사용하여 요소의 존재를 확인하십시오. 나는 단지 [] 연산자가 존재하지 않는다면 주어진 원소를 더한다는 것을 언급하기를 원한다. 그래서 당신의지도를 수정할 것이므로 그것을 검사에 사용할 수 없다.

1

정확하지 않음 : 0이지도에없는 경우 코드에 값 0이 추가됩니다. 0NULL과 같기 때문에 코드가 0 값을 0에 할당하는지 여부를 코드가 테스트하고 있음을 의미합니다. 0 키가 이미지도에 있는지 여부는 테스트되지 않았습니다.

키가지도에 있는지 여부를 테스트하려면 count() 기능을 사용하십시오. 키가있는 경우 1을 반환하고 그렇지 않으면 0을 반환합니다.

int main(int argc, char const *argv[]) { 
    map<int, char> m1; 
    count << (m1.count(0) ? "0" : "1") << '\n'; 
} 
관련 문제