문제

참조를 전달하는 이유가 있습니까? std::map const로 인해 [] 연산자가 중단됩니까?const를 사용할 때 다음 컴파일러 오류(gcc 4.2)가 발생합니다.

오류:'map [name]'에서 'operator []'와 일치하지 않습니다.

함수 프로토타입은 다음과 같습니다.

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);

그리고, 제거해도 문제가 없다는 점을 말씀드리고 싶습니다. const 앞에 키워드 std::map.

올바르게 지시를 받았다면 [] 연산자는 키를 찾지 못한 경우 실제로 맵에 새 쌍을 삽입합니다. 이는 물론 이런 일이 발생하는 이유를 설명하지만 이것이 가능할 것이라고는 상상할 수 없습니다. 받아들일 수 있는 행동.

다음과 같은 더 좋은 방법이 있다면 찾다 [] 대신에 사용해 주시면 감사하겠습니다.그래도 직장을 찾을 수없는 것 같습니다 ...나는 받는다 const 일치하지 않는 반복자 오류.

도움이 되었습니까?

해결책

예, 사용할 수 없습니다 operator[]. 사용 find, 그러나 반환합니다 const_iterator 대신에 iterator:

std::map<std::string, std::string>::const_iterator it;
it = map.find(name);
if(it != map.end()) {
    std::string const& data = it->second;
    // ...
}

포인터와 같습니다. 당신은 할당 할 수 없습니다 int const* 에게 int*. 마찬가지로, 당신은 할당 할 수 없습니다 const_iterator 에게 iterator.

다른 팁

Operator []를 사용하는 경우 std :: map은 주어진 키가있는 항목을 찾습니다. 그것이 찾지 못하면 그것을 만듭니다. 따라서 Const의 문제.

찾기 방법을 사용하면 괜찮을 것입니다.

find ()를 사용하는 방법에 대한 코드를 게시 해 주시겠습니까? 올바른 방법은 다음과 같습니다.

if( map.find(name) != map.end() )
{
   //...
}

C++11을 사용하는 경우, 표준::지도::at 당신을 위해 일해야합니다.

이유 표준::맵::연산자[] 작동하지 않는 것은 찾고 있는 키가 맵에 없는 경우 제공된 키를 사용하여 새 요소를 삽입하고 이에 대한 참조를 반환한다는 것입니다(자세한 내용은 링크 참조).const std::map에서는 불가능합니다.

그러나 'at' 메소드는 키가 존재하지 않는 경우 예외를 발생시킵니다.즉, 'at' 메소드를 사용하여 요소에 액세스를 시도하기 전에 std::map::find 메소드를 사용하여 키의 존재를 확인하는 것이 아마도 좋은 생각일 것입니다.

아마도 std ::지도에 const 연산자가 없기 때문일 것입니다. 연산자 []는 찾을 수없는 경우 원하는 요소를 추가합니다. 따라서 추가 가능성없이 검색하려면 find () 메소드를 사용하십시오.

"const 불일치 반복 오류"의 경우 :

찾기 ()에는 두 개의 과부하가 있습니다.

      iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;

나의 추측 이 오류가 발생하는 것입니다. find() a에 전화하십시오 const 지도:

iterator<...> myIter /* non-const */ = myConstMap.find(...)

아마도 당신이보고있는 것은 아니지만 오류가 발생할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top