在C++ STL中的unordered_map emplace()
unordered_map::emplace() 是C++ STL中的内置函数,它将键和其元素插入到unordered_map容器中。它有效地增加了容器大小。如果同一键被不止一次emplace,那么map仅将第一个元素存储为map是不存储相同值的多个键的容器。
它与unordered_map insert()有何不同? emplace的优点是,它进行原地插入,并避免了对象的不必要复制。对于基元数据类型,我们使用哪种方式并不重要。有关详细信息,请参阅这里。
语法:
unordered_map_name.emplace(key, element)
参数:
- key - 指定要插入到multimap容器中的键。
- element - 指定要插入到map容器中的键相应的元素。
返回值 :它返回一个迭代器和一个布尔值对。如果元素已经存在,则返回一个指向已插入元素的迭代器,如果元素不存在,则返回一个指向新添加的容器的迭代器。布尔值表示是否插入了。下面的程序说明了 emplace 函数的工作原理:
示例1:
// C ++程序示例
// unordered_map::emplace()函数
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 初始化容器
unordered_map<int, int> mp;
// 以随机顺序插入元素
mp.emplace(2, 30);
mp.emplace(1, 40);
mp.emplace(2, 20);
mp.emplace(1, 50);
mp.emplace(4, 50);
// 打印元素
for (auto it = mp.begin(); it != mp.end(); it++)
cout << it->first << "==>>"
<< it->second << "\n";
}
输出:
4==>>50
2==>>30
1==>>40
示例2 :假设我们要显示字符串中的所有唯一字符及其索引。如果一个字符出现多次,则显示其首次出现的索引。
// C ++程序示例
// unordered_map::emplace()函数
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str = "geeksforgeeks";
unordered_map<char, int> mp;
for (int i = 0; i < str.length(); i++)
mp.emplace(str[i], i);
for (auto it = mp.begin(); it != mp.end(); it++)
cout << it->first << "==>>" << it->second << "\n";
}
输出:
r==>>7
e==>>1
s==>>4
g==>>0
k==>>3
f==>>5
o==>>6
说明: “g”** 在字符串中出现了两次,分别是在“0”和“8”处,但是emplace函数不允许我们保存到unordered_map中,直到给定的key是唯一的。这就是为什么“0”被保存而“8”被排除。对于“e”,“1”被保存,“2”、“9”和“10”被排除。