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

Jinku Hu 2023年10月12日
  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;
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Map