C ++ const 맵 요소 액세스


100

연산자 []를 사용하여 const C ++ 맵의 요소에 액세스하려고했지만이 메서드는 실패했습니다. 또한 "at ()"를 사용하여 동일한 작업을 수행하려고했습니다. 이번에는 효과가있었습니다. 그러나 "at ()"를 사용하여 const C ++ 맵의 요소에 액세스하는 방법에 대한 참조를 찾을 수 없습니다. "at ()"는 C ++ 맵에 새로 추가 된 함수입니까? 이에 대한 자세한 정보는 어디에서 찾을 수 있습니까? 대단히 감사합니다!

예는 다음과 같습니다.

#include <iostream>
#include <map>

using namespace std;

int main()
{
        map<int, char> A;
        A[1] = 'b';
        A[3] = 'c';

        const map<int, char> B = A;

        cout << B.at(3) << endl; // it works
        cout << B[3] << endl;  // it does not work

}

"B [3]"를 사용하는 경우 컴파일 중에 다음 오류가 반환되었습니다.

t01.cpp : 14 : 오류 : '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] (의'this '인수로'const std :: map, std :: allocator>> '전달 const _Key &) [with _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] '는 한정자를 버립니다.

사용 된 컴파일러는 g ++ 4.2.1입니다.

답변:


124

at()std::mapC ++ 11 의 새로운 방법입니다 .

operator[]주어진 키를 가진 요소가 존재하지 않는 경우 처럼 새로운 기본 생성 요소를 삽입하는 대신 std::out_of_range예외 가 발생합니다. (이것은 at()for deque및 의 동작과 유사합니다 vector.)

이 동작으로 인해 항상지도를 변경할 가능성이있는 것과 달리 의 const과부하 가있는 것이 합리적입니다 .at()operator[]


"at"가 예외를 던지는 대신 기본값을 반환하도록 할 수 있습니까?
user1202136

내가 사용하고 at()VS2010 툴킷을 사용하는 프로젝트 세트에 VS2013에서 함께. 나는 그것이 내가 C ++ 11을 사용하지 않는다는 것을 의미한다고 생각했다. 그러나 그것은 컴파일된다.
thomthom

1
지도를 변경하는 대신 매핑되지 않은 요소에 대한 예외를 throw 할 수도있는 const operator []를 생략하는 것은 이치에 맞지 않는다는 점을 언급해야합니다.
Spencer

@Spencer operator []의 const 및 non-const 오버로드가 다른 영향을 미친다면 놀랄 것입니다. 일반적으로 프로그램에서 상수가 아닌 객체 나 참조가 const로 만들어지면 프로그램이 컴파일되는 한 동일한 방식으로 계속 작동 할 것으로 예상합니다. 상수가 아닌 오버로드 만 예외를 throw하도록 허용하면 런타임까지 잡히지 않는 버그가 발생할 수 있습니다.
Brian

@Brian " const 오버로드 만 예외를 발생시킬 수 있도록 허용"을 의미 했습니까 ?
Spencer

33

요소가 존재하지 않는 경우 map는이 operator []추가됩니다 - 분명히에없는 작업을 할 수있는 constC ++의지도를 정의하지 않도록 const작업자의 버전. 이것은 잠재적 인 런타임 오류를 방지하는 컴파일러의 유형 검사기의 좋은 예입니다.

귀하의 경우 에는 (반복자) 요소가 존재하는 경우 에만 반환하는 find대신 을 사용해야 하며 . 항목이 존재하지 않으면지도의 .mapend()

at존재하지 않으며 심지어 컴파일해서는 안됩니다. 아마도 이것은 "컴파일러 확장"(=버그 C ++ 0x의 새로운 기능).


C ++ 표준은 구현이 라이브러리 클래스에서 추가 비표준 멤버 함수를 정의하는 것을 금지합니까?
Tim Martin

@Tim 인터페이스가 고정되어 있다고 생각합니다.
Konrad Rudolph

4

[] 연산자는 주어진 키가 존재하지 않으면 맵에 새 항목 을 만듭니다 . 따라서지도를 변경할 수 있습니다.

링크를 참조하십시오 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.