# std::map<Key,T,Compare,Allocator>::insert_or_assign

< cpp‎ | container‎ | map

template <class M> std::pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); | (1) | (C++17 起)
template <class M> std::pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); | (2) | (C++17 起)
template <class M> iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); | (3) | (C++17 起)
template <class M> iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); | (4) | (C++17 起)

1,3) 若等价于 `k` 的键已存在于容器中，则赋值 std::forward<M>(obj) 给对应于键 `k` 的 `mapped_type` 。若键不存在，则如同用 `insert` 插入从 value_type(k, std::forward<M>(obj)) 构造的新值。
2,4) 同 (1,3) ，除了从 value_type(std::move(k), std::forward<M>(obj)) 构造被映射值。

若 std::is_assignable_v<mapped_type&, M&&> 为 false 则行为未定义 (C++20 前)程序非良构 (C++20 起)。

没有迭代器或引用被非法化。

### 参数

k | - | 用于查找和若找不到则插入的键
hint | - | 指向新元素将要插入位置之前位置的迭代器
obj | - | 要插入或赋值的值

### 返回值

1,2) 若插入发生则 bool 组分为 true ，若赋值发生则 bool 组分为 false 。迭代器组分指向插入或更新的元素。
3,4) 指向被插入或更新的元素的迭代器。

### 复杂度

1,2) 与 `emplace` 的相同
3,4) 与 `emplace_hint` 的相同

### 注解

`insert_or_assign` 返回多于 `operator[]` 的信息，而且不要求被映射类型的可默认构造性。

### 示例

    #include <iostream>
    #include <map>
    #include <string>

    auto print_node = [](const auto &node) {
        std::cout << "[" << node.first << "] = " << node.second << '\n';
    };

    auto print_result = [](auto const &pair) {
        std::cout << (pair.second ? "inserted: " : "assigned: ");
        print_node(*pair.first);
    };

    int main()
    {
        std::map<std::string, std::string> myMap;

        print_result( myMap.insert_or_assign("a", "apple"     ) );
        print_result( myMap.insert_or_assign("b", "banana"    ) );
        print_result( myMap.insert_or_assign("c", "cherry"    ) );
        print_result( myMap.insert_or_assign("c", "clementine") );

        for (const auto &node : myMap) { print_node(node); }
    }

输出：

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

### 参阅

operator[] | 访问或插入指定的元素 (公开成员函数)
at | 访问指定的元素，同时进行越界检查 (公开成员函数)
insert | 插入元素或结点 (C++17 起) (公开成员函数)
emplace (C++11) | 原位构造元素 (公开成员函数)