在 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