Namespaces
Variants

std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: insert_or_assign

From cppreference.net
template < class M >
std:: pair < iterator, bool > insert_or_assign ( const key_type & k, M && obj ) ;
(1) (начиная с C++23)
template < class M >
std:: pair < iterator, bool > insert_or_assign ( key_type && k, M && obj ) ;
(2) (начиная с C++23)
template < class K, class M >
std:: pair < iterator, bool > insert_or_assign ( K && k, M && obj ) ;
(3) (начиная с C++23)
template < class M >
iterator insert_or_assign ( const_iterator hint, const key_type & k, M && obj ) ;
(4) (начиная с C++23)
template < class M >
iterator insert_or_assign ( const_iterator hint, key_type && k, M && obj ) ;
(5) (начиная с C++23)
template < class K, class M >
iterator insert_or_assign ( const_iterator hint, K && k, M && obj ) ;
(6) (начиная с C++23)
1,2) Если ключ, эквивалентный k уже существует в контейнере, присваивает std:: forward < M > ( obj ) соответствующему mapped_type ключа k . Если ключ не существует, вставляет новое значение как если бы с помощью
Программа является некорректной, если либо std:: is_assignable_v < mapped_type & , M > либо std:: is_constructible_v < mapped_type, M > равно false .
3,6) Если ключ, эквивалентный k уже существует в контейнере, присваивает std:: forward < M > ( obj ) соответствующему mapped_type ключу k . В противном случае эквивалентно
Преобразование из k в key_type должно конструировать объект u , для которого find ( k ) == find ( u ) является true . В противном случае поведение не определено.
Эти перегрузки участвуют в разрешении перегрузки только если:

Содержание

Параметры

k - ключ, используемый как для поиска, так и для вставки, если не найден
hint - итератор на позицию, перед которой будет вставлен новый элемент
obj - значение для вставки или присваивания

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

1-3) Компонент bool имеет значение true если произошла вставка и false если произошло присваивание. Компонент-итератор указывает на элемент, который был вставлен или обновлен.
4-6) Итератор, указывающий на элемент, который был вставлен или обновлён.

Сложность

1-3) То же, что и для emplace .
4-6) То же, что и для emplace_hint .

Примечания

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

Пример

#include <flat_map>
#include <iostream>
#include <string>
void print_node(const auto& node)
{
    std::cout << '[' << node.first << "] = " << node.second << '\n';
}
void print_result(auto const& pair)
{
    std::cout << (pair.second ? "inserted: " : "assigned: ");
    print_node(*pair.first);
}
int main()
{
    std::flat_map<std::string, std::string> map;
    print_result(map.insert_or_assign("a", "apple"));
    print_result(map.insert_or_assign("b", "banana"));
    print_result(map.insert_or_assign("c", "cherry"));
    print_result(map.insert_or_assign("c", "clementine"));
    for (const auto& node : map)
        print_node(node);
}

Вывод:

inserted: [a] = apple
inserted: [b] = banana
inserted: [c] = cherry
assigned: [c] = clementine
[a] = apple
[b] = banana
[c] = clementine

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

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