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

来自cppreference.com
< 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) 给对应于键 kmapped_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

参阅

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