在 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