在 C++ 中的 STL 映射中插入新元素
-
使用
insert
成员函数在 C++ 中向std::map
添加新元素 -
使用
insert_or_assign
成员函数在 C++ 中向std::map
添加新元素 -
使用
emplace
成员函数在 C++ 中向std::map
添加新元素 -
使用
emplace_hint
成员函数在 C++ 中向std::map
添加新元素
本文将解释如何在 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;
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