STD::map 插入insert详解

本文详细介绍了C++标准库中std::map的插入方法,包括常量引用来插入、右值引用、emplace重载、定位插入、迭代器范围和初始化列表等,并通过示例展示了各种情况下的使用和返回值解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

std::pair<iterator, bool> insert( const value_type& value );

(1)

template< class P >
std::pair<iterator, bool> insert( P&& value );

(2)(since C++11)

std::pair<iterator, bool> insert( value_type&& value );

(3)(since C++17)
(4)

iterator insert( iterator hint, const value_type& value );

(until C++11)

iterator insert( const_iterator hint, const value_type& value );

(since C++11)

template< class P >
iterator insert( const_iterator hint, P&& value );

(5)(since C++11)

iterator insert( const_iterator hint, value_type&& value );

(6)(since C++17)

template< class InputIt >
void insert( InputIt first, InputIt last );

(7)

void insert( std::initializer_list<value_type> ilist );

(8)(since C++11)

insert_return_type insert(node_type&& nh);

(9)(since C++17)

iterator insert(const_iterator hint, node_type&& nh);

(10)(since C++17)

Inserts element(s) into the container, if the container doesn't already contain an element with an equivalent key.

往容器插入一个元素,插入前这个元素不存在于容器中。如果容器中已存在这个元素就会插入失败。注意1-3重载版本的返回值是一个pair

std::pair<iterator, bool>

 返回值是一个迭代器和一个布尔值组成的pair。可以通过这个布尔值查看这个insert操作是否成功。

#include <iomanip>
#include <iostream>
#include <map>
#include <string>
 
using namespace std::literals;
 
template<typename It>
void printInsertionStatus(It it, bool success)
{
    std::cout << "Insertion of " << it->first << (success ? " succeeded\n" : " failed\n");
}
 
int main()
{
    std::map<std::string, float> karasunoPlayerHeights;
 
    // Overload 3: insert from rvalue reference
    //重载3:插入右值引用,{"Hinata"s, 162.8}是一个临时变量
    const auto [it_hinata, success] = karasunoPlayerHeights.insert({"Hinata"s, 162.8});
    printInsertionStatus(it_hinata, success);
 
    {
        // Overload 1: insert from lvalue reference
        //重载1:插入左值引用,这一步中it_hinata是上一次插入的返回值,因此这次插入将会返回失败
        const auto [it, success2] = karasunoPlayerHeights.insert(*it_hinata);
        printInsertionStatus(it, success2);
    }
    {
        // Overload 2: insert via forwarding to emplace
        //重载2:
        const auto [it, success] = karasunoPlayerHeights.insert({"Kageyama", 180.6});
        printInsertionStatus(it, success);
    }
 
    {
        // Overload 6: insert from rvalue reference with positional hint
        //重载6:在离hint尽可能近的位置的插入一个右值
        const std::size_t n = std::size(karasunoPlayerHeights);
        const auto it = karasunoPlayerHeights.insert(it_hinata, {"Azumane"s, 184.7});
        printInsertionStatus(it, std::size(karasunoPlayerHeights) != n);
    }
    {
        // Overload 4: insert from lvalue reference with positional hint
        //重载4:在hint相关的位置插入一个左值
        const std::size_t n = std::size(karasunoPlayerHeights);
        const auto it = karasunoPlayerHeights.insert(it_hinata, *it_hinata);
        printInsertionStatus(it, std::size(karasunoPlayerHeights) != n);
    }
    {
        // Overload 5: insert via forwarding to emplace with positional hint
        const std::size_t n = std::size(karasunoPlayerHeights);
        const auto it = karasunoPlayerHeights.insert(it_hinata, {"Tsukishima", 188.3});
        printInsertionStatus(it, std::size(karasunoPlayerHeights) != n);
    }
 
    auto node_hinata = karasunoPlayerHeights.extract(it_hinata);
    std::map<std::string, float> playerHeights;
 
    // Overload 7: insert from iterator range
    //重载7,迭代器范围插入
    playerHeights.insert(std::begin(karasunoPlayerHeights), std::end(karasunoPlayerHeights));
 
    // Overload 8: insert from initializer_list
    //初始化列表插入
    playerHeights.insert({{"Kozume"s, 169.2}, {"Kuroo", 187.7}});
 
 
    // Overload 9: insert node
    //重载9,节点插入
    const auto status = playerHeights.insert(std::move(node_hinata));
    printInsertionStatus(status.position, status.inserted);
 
    node_hinata = playerHeights.extract(status.position);
    {
        // Overload 10: insert node with positional hint
        const std::size_t n = std::size(playerHeights);
        const auto it = playerHeights.insert(std::begin(playerHeights), std::move(node_hinata));
        printInsertionStatus(it, std::size(playerHeights) != n);
    }
 
 
    // Print resulting map
    std::cout << std::left << '\n';
    for (const auto& [name, height] : playerHeights)
        std::cout << std::setw(10) << name << " | " << height << "cm\n";
}

输出:

Insertion of Hinata succeeded
Insertion of Hinata failed
Insertion of Kageyama succeeded
Insertion of Azumane succeeded
Insertion of Hinata failed
Insertion of Tsukishima succeeded
Insertion of Hinata succeeded
Insertion of Hinata succeeded
 
Azumane    | 184.7cm
Hinata     | 162.8cm
Kageyama   | 180.6cm
Kozume     | 169.2cm
Kuroo      | 187.7cm
Tsukishima | 188.3cm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值