std::map<Key,T,Compare,Allocator>::insert
std::pair<iterator, bool> insert( const value_type& value ); | (1) | |
template< class P > | (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 > | (5) | (since C++11) |
iterator insert( const_iterator hint, value_type&& value ); | (6) | (since C++17) |
template< class InputIt > | (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