在 C++ 中的 STL 映射中插入新元素

Jinku Hu 2023年1月30日 2021年6月28日
  1. 使用 insert 成员函数在 C++ 中向 std::map 添加新元素
  2. 使用 insert_or_assign 成员函数在 C++ 中向 std::map 添加新元素
  3. 使用 emplace 成员函数在 C++ 中向 std::map 添加新元素
  4. 使用 emplace_hint 成员函数在 C++ 中向 std::map 添加新元素
在 C++ 中的 STL 映射中插入新元素

本文将解释如何在 C++ 中的 std::map 对象中添加新元素的多种方法。

使用 insert 成员函数在 C++ 中向 std::map 添加新元素

STL map 容器提供了一种数据结构,用于将键值对存储为元素,在插入或初始化时自动排序。可以使用多种方法将新元素添加到 std::map 对象,其中最常见的是 insert 函数。

insert 成员函数有多个重载。尽管如此,最简单的方法只需要一个参数来指定对插入对象的 const 引用。另一个重载可以接受 r 值引用并使用 std::forward 命令就地构造元素,如以下示例代码所示。

后一个重载返回一对插入元素的迭代器和 bool 值,表明插入成功。我们还演示了 insert 函数的重载,它采用类似于初始化列表的键值列表,并从值构造元素。但是,此重载没有返回类型。

#include <iostream>
#include <map>

using std::cout; using std::endl;
using std::map; using std::string;

template<typename Map>
void printMap(Map& m) {
    for (auto& p: m)
        cout << p.first << " : " << p.second << ";" << endl;
    cout << endl;
}

int main() {
    std::map<string, string> m1 = {{"h", "htop"},
                                   {"k", "ktop"},};

    auto ret = m1.insert({"k", "ktop"});
    ret.second ? cout << "Inserted" : cout << "Not Inserted";
    cout << "\n";

    m1.insert({{"k", "ktop"},
               {"p", "ptop"}});
    printMap(m1);

    return EXIT_SUCCESS;
}

输出:

Not Inserted
h : htop;
k : ktop;
p : ptop;

使用 insert_or_assign 成员函数在 C++ 中向 std::map 添加新元素

较新的 C++17 标准提供了一个名为 insert_or_assign 的成员函数,如果给定的键不存在,它会在映射中插入一个新元素。否则,该函数会将新值分配给具有现有键的元素。

该函数有多个重载,但以下示例中调用的重载将两个参数作为对键和值的 r 值引用。此重载还返回一对迭代器和一个 bool 值。请注意,我们使用条件运算符检查插入的状态并打印相应的消息。

#include <iostream>
#include <map>

using std::cout; using std::endl;
using std::map; using std::string;

template<typename Map>
void printMap(Map& m) {
    for (auto& p: m)
        cout << p.first << " : " << p.second << ";" << endl;
    cout << endl;
}

int main() {
    std::map<string, string> m1 = {{"h", "htop"},
                                   {"k", "ktop"},};

    auto ret = m1.insert_or_assign("p", "ptop");
    ret.second ? cout << "Inserted" : cout << "Assigned";
    cout << "\n";

    ret = m1.insert_or_assign("t", "ttop");
    ret.second ? cout << "Inserted" : cout << "Assigned";
    cout << "\n";

    printMap(m1);

    return EXIT_SUCCESS;
}

输出:

Inserted
Inserted
h : htop;
k : ktop;
p : ptop;
t : ttop;

使用 emplace 成员函数在 C++ 中向 std::map 添加新元素

std::map 容器提供的另一个成员函数是 emplace。与 insert 函数相比,此函数提供了效率,因为它不需要复制参数值。相反,emplace 函数将就地构造元素,这意味着给定的参数被转发到类构造函数。请注意,根据参数,将调用相应的构造函数。

#include <iostream>
#include <map>

using std::cout; using std::endl;
using std::map; using std::string;

template<typename Map>
void printMap(Map& m) {
    for (auto& p: m)
        cout << p.first << " : " << p.second << ";" << endl;
    cout << endl;
}

int main() {
    std::map<string, string> m1 = {{"h", "htop"},
                                   {"k", "ktop"},};

    auto ret = m1.emplace("t", "ttop");
    ret.second ? cout << "Inserted" : cout << "Not Inserted";
    cout << endl;

    ret = m1.emplace(std::make_pair("t", "ttop"));
    ret.second ? cout << "Inserted" : cout << "Not Inserted";
    cout << endl;

    printMap(m1);


    return EXIT_SUCCESS;
}

输出:

Inserted
Not Inserted
h : htop;
k : ktop;
t : ttop;

使用 emplace_hint 成员函数在 C++ 中向 std::map 添加新元素

或者,可以使用 emplace_hint 成员函数将一个新元素插入到 Map 中,并带有一个名为 hint 的附加参数,该参数指定操作应开始搜索的位置。如果该过程成功,它将向新插入的元素返回一个迭代器。否则,返回具有相同键的现有元素的迭代器。

#include <iostream>
#include <map>

using std::cout; using std::endl;
using std::map; using std::string;

template<typename Map>
void printMap(Map& m) {
    for (auto& p: m)
        cout << p.first << " : " << p.second << ";" << endl;
    cout << endl;
}

int main() {
    std::map<string, string> m1 = {{"h", "htop"},
                                   {"k", "ktop"},};

    auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");

    m1.emplace_hint(ret, "m", "mtop");
    m1.emplace_hint(m1.begin(), "p", "ptop");

    printMap(m1);


    return EXIT_SUCCESS;
}

输出:

h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C++ Map