주어진 키가 C ++ std :: map에 있는지 확인하는 방법 string> m; m.insert(make_pair(“f”,”++–“)); pair<mi,mi> p = m.equal_range(“f”);//I’m not

주어진 키가 맵에 있는지 확인하고 다소 할 수 없습니다.

typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here

p에있는 내용을 어떻게 인쇄 할 수 있습니까?



답변

사용하다 map::find

if ( m.find("f") == m.end() ) {
  // not found
} else {
  // found
}

답변

맵에 특정 키가 존재하는지 확인하려면 count다음 방법 중 하나로 멤버 함수를 사용하십시오 .

m.count(key) > 0
m.count(key) == 1
m.count(key) != 0

그만큼 문서 에는 map::find말한다 : “다른 멤버 함수는, map::count단지 특정 키가 존재하는지 여부를 확인하는 데 사용할 수 있습니다.”

그만큼 문서 에는 map::count말한다 : “지도 컨테이너의 모든 요소가 고유하기 때문에 (요소가 발견되는 경우) 함수는 1을 반환 할 수 있습니다 또는 (기타) 제로.”

존재하는 키를 통해지도에서 값을 검색하려면 map :: at을 사용하십시오 .

value = m.at(key)

달리 지도 : 연산자 [] , map::at지정된 키가 존재하지 않을 경우지도에 새로운 키를 생성하지 않습니다.


답변

C ++ 20 은이 std::map::contains를 가능하게합니다.

#include <iostream>
#include <string>
#include <map>

int main()
{
    std::map<int, std::string> example = {{1, "One"}, {2, "Two"},
                                     {3, "Three"}, {42, "Don\'t Panic!!!"}};

    if(example.contains(42)) {
        std::cout << "Found\n";
    } else {
        std::cout << "Not found\n";
    }
}

답변

당신은 사용할 수 있습니다 .find():

map<string,string>::iterator i = m.find("f");

if (i == m.end()) { /* Not found */ }
else { /* Found, i->first is f, i->second is ++-- */ }

답변

m.find == m.end() // not found 

다른 API를 사용하려면 다음을 찾으십시오. m.count(c)>0

 if (m.count("f")>0)
      cout << " is an element of m.\n";
    else
      cout << " is not an element of m.\n";

답변

당신이 원하는 것 같아요 map::find. 이 ( m.find("f")가) 같으면 m.end()키를 찾을 수 없습니다. 그렇지 않으면 find는 찾은 요소를 가리키는 반복자를 리턴합니다.

p.first스트림 삽입에는 작동하지 않는 반복자 이기 때문에 오류가 발생 합니다. 마지막 줄을로 변경하십시오 cout << (p.first)->first;. p반복자, p.first반복자, p.first->first키 문자열입니다.

지도는 주어진 키에 대해 하나의 요소 만 가질 수 있으므로 equal_range그다지 유용하지 않습니다. 모든 연관 컨테이너에 대해 정의되었으므로 맵에 대해 정의되었지만 멀티 맵에는 훨씬 더 흥미 롭습니다.


답변

C++17으로 이것을 조금 더 단순화했습니다 If statement with initializer. 이렇게하면 케이크를 먹고 먹을 수 있습니다.

if ( auto it{ m.find( "key" ) }; it != std::end( m ) )
{
    // Use `structured binding` to get the key
    // and value.
    auto[ key, value ] { *it };

    // Grab either the key or value stored in the pair.
    // The key is stored in the 'first' variable and
    // the 'value' is stored in the second.
    auto mkey{ it->first };
    auto mvalue{ it->second };

    // That or just grab the entire pair pointed
    // to by the iterator.
    auto pair{ *it };
}
else
{
   // Key was not found..
}