std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::insert_or_assign

来自cppreference.com

 
 
 
 
template< class M >
std::pair<iterator, bool> insert_or_assign( const Key& k, M&& obj );
(1) (C++17 起)
template< class M >
std::pair<iterator, bool> insert_or_assign( Key&& k, M&& obj );
(2) (C++17 起)
template< class K, class M >
std::pair<iterator, bool> insert_or_assign( K&& k, M&& obj );
(3) (C++26 起)
template< class M >
iterator insert_or_assign( const_iterator hint, const Key& k, M&& obj );
(4) (C++17 起)
template< class M >
iterator insert_or_assign( const_iterator hint, Key&& k, M&& obj );
(5) (C++17 起)
template< class K, class M >
iterator insert_or_assign( const_iterator hint, K&& k, M&& obj );
(6) (C++26 起)
1,4) 若等价于 k 的键已存在于容器中,则赋值 std::forward<M>(obj) 给对应键 kmapped_type。若键不存在,则如同用 insert 插入从 value_type(k, std::forward<M>(obj)) 构造的新值。
2,5)(1,3),但从 value_type(std::move(k), std::forward<M>(obj)) 构造被映射值。
3,6) 若等价于 k 的键已存在于容器中,则赋值 std::forward<M>(obj) 给对应键 kmapped_type。若键不存在,用 std::forward<K>(k), std::forward<M>(obj)) 构造 u 的对象 value_type,然后将 u 插入 *this 中。 如果 hash_function()(u.first) != hash_function()(k) || contains(u.first)true,行为未定义。value_type 必须从 std::forward<K>(k), std::forward<M>(obj) 可就位构造 (EmplaceConstructible) unordered_map。 此重载只有在Hash::is_transparentKeyEqual::is_transparent 均合法并指代类型时才会参与重载决议。这假设使得 Hash 能用 KKey 类型调用,并且 KeyEqual 是透明的,进而允许调用此函数时不需要构造 Key 的实例。

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

如果操作后新的元素数量大于原 max_load_factor() * bucket_count() 则会发生重散列。
如果(因插入而)发生了重散列,索引迭代器均会失效。否则(未发生重散列),则迭代器不会失效。

参数

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

返回值

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

复杂度

1-3)emplace 的相同
4-6)emplace_hint 的相同

注解

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

功能特性测试 标准 功能特性
__cpp_lib_unordered_map_try_emplace 201411L (C++17) std::unordered_map::try_emplace,
std::unordered_map::insert_or_assign
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) 有序无序关联container的剩余成员函数的异构重载。(3)(6)

示例

#include <iostream>
#include <string>
#include <unordered_map>
 
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::unordered_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
[c] = clementine
[a] = apple
[b] = banana

参阅

访问或插入指定的元素
(公开成员函数)
带越界检查访问指定的元素
(公开成员函数)
插入元素或节点 (C++17 起)
(公开成员函数)
原位构造元素
(公开成员函数)