Namespaces
Variants

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: operator[]

From cppreference.net

T & operator [ ] ( const Key & key ) ;
(1) (начиная с C++23)
T & operator [ ] ( Key && key ) ;
(2) (начиная с C++23)
template < class K >
T & operator [ ] ( K && x ) ;
(3) (начиная с C++23)

Возвращает ссылку на значение, которое сопоставлено с ключом, эквивалентным key или x соответственно, выполняя вставку, если такой ключ еще не существует.

1) Вставляет объект value_type , созданный на месте, если ключ не существует. Эквивалентно return try_emplace ( x ) . first - > second ; .
2) Вставляет объект value_type , созданный на месте, если ключ не существует. Эквивалентно return try_emplace ( std :: move ( x ) ) . first - > second ;
3) Вставляет объект value_type , созданный на месте, если нет ключа, который прозрачно сравнивается эквивалентно со значением x .
Эквивалентно return this - > try_emplace ( std:: forward < K > ( x ) ) . first - > second ; . Эта перегрузка участвует в разрешении перегрузки только если Compare является прозрачным . Это позволяет вызывать данную функцию без создания экземпляра Key .

Содержание

Параметры

key - ключ элемента для поиска
x - значение любого типа, которое можно прозрачно сравнить с ключом

Возвращаемое значение

1,2) Ссылка на отображаемое значение нового элемента, если элемент с ключом key не существовал. В противном случае — ссылка на отображаемое значение существующего элемента, чей ключ эквивалентен key .
3) Ссылка на отображаемое значение нового элемента, если элемент с ключом, эквивалентным значению x не существовал. В противном случае - ссылка на отображаемое значение существующего элемента, чей ключ эквивалентен x .

Исключения

Если любое операция выбрасывает исключение, вставка не имеет эффекта.

Сложность

Логарифмическая от размера контейнера плюс стоимость вставки (если таковая имеется) пустого элемента.

Примечания

operator [ ] является неконстантным, поскольку он вставляет ключ, если он не существует. Если такое поведение нежелательно или если контейнер const , можно использовать at .

insert_or_assign возвращает больше информации, чем operator [ ] и не требует конструируемости по умолчанию для типа значения.

Пример

#include <iostream>
#include <string>
#include <flat_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::flat_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[] инициализирует счетчик нулем)
    std::flat_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'

Смотрите также

доступ к указанному элементу с проверкой границ
(public member function)
вставляет элемент или присваивает текущему элементу, если ключ уже существует
(public member function)
вставляет на месте, если ключ не существует, не делает ничего, если ключ существует
(public member function)