Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: operator[]

From cppreference.net

T & operator [ ] ( const Key & key ) ;
(1)
T & operator [ ] ( Key && key ) ;
(2) (C++11부터)
template < class K >
T & operator [ ] ( K && x ) ;
(3) (C++26부터)

키가 key 또는 x 와 동등한 값에 매핑된 값의 참조를 반환하며, 해당 키가 아직 존재하지 않는 경우 삽입을 수행합니다.

1) 키가 존재하지 않으면 value_type ( key, T ( ) ) 을 삽입합니다.
-
key_type CopyConstructible 요구 사항을 충족해야 합니다.
-
mapped_type CopyConstructible DefaultConstructible 요구 사항을 충족해야 합니다.
삽입이 수행되면 매핑된 값은 값 초기화 (클래스 타입의 경우 기본 생성, 그 외에는 0 초기화)되고 이에 대한 참조가 반환됩니다.
(C++11 이전)
1) 키가 존재하지 않는 경우 value_type 객체를 std:: piecewise_construct , std:: forward_as_tuple ( key ) , std:: tuple <> ( ) 로부터 제자리에서 생성하여 삽입합니다.
다음 코드와 동등함: return this - > try_emplace ( key ) . first - > second ; . (C++17부터) 기본 할당자를 사용할 경우, 이로 인해 키는 key 로부터 복사 생성되고 매핑된 값은 값 초기화 됩니다.
-
value_type 은 다음으로부터 EmplaceConstructible 이어야 함: std:: piecewise_construct , std:: forward_as_tuple ( key ) , std:: tuple <> ( ) . 기본 할당자를 사용할 경우, 이는 key_type CopyConstructible 이고 mapped_type DefaultConstructible 이어야 함을 의미합니다.
2) 키가 존재하지 않으면 value_type 객체를 std:: piecewise_construct , std:: forward_as_tuple ( std :: move ( key ) ) , std:: tuple <> ( ) 로부터 제자리에서 생성하여 삽입합니다.
다음 코드와 동등함: return this - > try_emplace ( std :: move ( key ) ) . first - > second ; . (C++17부터)
기본 할당자를 사용할 경우, 이는 키가 key 로부터 이동 생성되고 매핑된 값이 값 초기화 됨을 의미합니다.
-
value_type EmplaceConstructible 이어야 하며, 다음으로부터 생성 가능해야 함: std:: piecewise_construct , std:: forward_as_tuple ( std :: move ( key ) ) , std:: tuple <> ( ) . 기본 할당자를 사용할 경우, 이는 key_type MoveConstructible 이어야 하고 mapped_type DefaultConstructible 이어야 함을 의미합니다.
(C++11 이후)
3) 키가 값 x 와 투명하게 비교하여 동등 하는 것이 없으면, 제자리에서 생성된 value_type 객체를 삽입합니다.
다음에 해당함: return this - > try_emplace ( std:: forward < K > ( x ) ) . first - > second ; . 이 오버로드는 Compare transparent 인 경우에만 오버로드 해결에 참여합니다. 이를 통해 Key 인스턴스를 생성하지 않고 이 함수를 호출할 수 있습니다.

반복자나 참조가 무효화되지 않습니다.

목차

매개변수

key - 검색할 요소의 키
x - 키와 투명하게 비교될 수 있는 임의 타입의 값

반환값

1,2) key 를 가진 요소가 존재하지 않을 경우 새 요소의 매핑된 값에 대한 참조. 그렇지 않을 경우 키가 key 와 동등한 기존 요소의 매핑된 값에 대한 참조.
3) x 와 동등하게 비교되는 키를 가진 요소가 존재하지 않았을 경우, 새 요소의 매핑된 값에 대한 참조. 그렇지 않으면, x 와 동등하게 비교되는 키를 가진 기존 요소의 매핑된 값에 대한 참조.

예외

어떤 연산에서 예외가 발생하면, 삽입은 아무런 효과를 가지지 않습니다.

복잡도

컨테이너 크기에 대해 로그 시간 복잡도를 가집니다.

참고 사항

발표된 C++11 및 C++14 표준에서 이 함수는 mapped_type 이(가) DefaultInsertable 이고 key_type 이(가) CopyInsertable 또는 MoveInsertable 이어야 한다고 명시되었습니다. 이 명세는 결함이 있었으며 LWG issue 2469 에 의해 수정되었으며, 위 설명은 해당 이슈의 해결 내용을 포함하고 있습니다.

그러나 한 구현(libc++)은 표준 문서에 명시된 대로 key_type mapped_type 객체를 두 개의 별도 할당자 construct() 호출을 통해 구성하는 것으로 알려져 있으며, value_type 객체를 배치하는 방식이 아닙니다.

operator [ ] 는 키가 존재하지 않을 경우 삽입하기 때문에 비상수(non-const)입니다. 이 동작이 바람직하지 않거나 컨테이너가 const 인 경우, at 을 사용할 수 있습니다.

insert_or_assign operator [ ] 보다 더 많은 정보를 반환하며 매핑된 타입의 기본 생성 가능성을 요구하지 않습니다.

(C++17부터)
Feature-test macro Value Std Feature
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) 정렬된 및 비정렬 연관 컨테이너의 나머지 멤버 함수에 대한 이종 오버로드 ordered and unordered associative containers . ( 3 )

예제

#include <iostream>
#include <string>
#include <map>
void println(auto const comment, auto const& map)
{
    std::cout << comment << '{';
    for (const auto& pair : map)
        std::cout << '{' << pair.first << ": " << pair.second << '}';
    std::cout << "}\n";
}
int main()
{
    std::map<char, int> letter_counts{{'a', 27}, {'b', 3}, {'c', 1}};
    println("letter_counts initially contains: ", letter_counts);
    letter_counts['b'] = 42; // 기존 값 업데이트
    letter_counts['x'] = 9;  // 새 값 삽입
    println("after modifications it contains: ", letter_counts);
    // 각 단어의 발생 횟수 계산
    // (operator[]의 첫 호출은 카운터를 0으로 초기화)
    std::map<std::string, int>  word_map;
    for (const auto& w : {"this", "sentence", "is", "not", "a", "sentence",
                          "this", "sentence", "is", "a", "hoax"})
        ++word_map[w];
    word_map["that"]; // 단순히 {"that", 0} 쌍을 삽입
    for (const auto& [word, count] : word_map)
        std::cout << count << " occurrence(s) of word '" << word << "'\n";
}

출력:

letter_counts initially contains: {{a: 27}{b: 3}{c: 1}}
after modifications it contains: {{a: 27}{b: 42}{c: 1}{x: 9}}
2 occurrence(s) of word 'a'
1 occurrence(s) of word 'hoax'
2 occurrence(s) of word 'is'
1 occurrence(s) of word 'not'
3 occurrence(s) of word 'sentence'
0 occurrence(s) of word 'that'
2 occurrence(s) of word 'this'

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 334 C++98 오버로드 (1) 의 효과는 단순히 반환하는 것이었음
( * ( ( insert ( std:: make_pair ( x, T ( ) ) ) ) . first ) ) . second
자체 설명을
제공하도록 변경됨

참고 항목

경계 검사와 함께 지정된 요소에 접근
(public member function)
요소를 삽입하거나 키가 이미 존재하는 경우 현재 요소에 할당
(public member function)
키가 존재하지 않으면 제자리에 삽입, 키가 존재하면 아무 작업도 수행하지 않음
(public member function)