C++ STL中的multiset::emplace()
多重集是一种类似于集合的关联容器,不同的是多个元素可以具有相同的值。
multiset::emplace()
此函数用于将一个新元素插入到多重集容器中。
语法 :
multisetname.emplace(value)
参数 :
要插入到多重集中的元素
被作为参数传递。
结果 :
该参数被添加到多重集中。
例子:
输入 : mymultiset{1, 2, 3, 4, 5};
mymultiset.emplace(6);
输出 : mymultiset = 1, 2, 3, 4, 5, 6
输入 : mymultiset{};
mymultiset.emplace("This");
mymultiset.emplace("is");
mymultiset.emplace("Geeksforgeeks");
输出 : mymultiset = Geeksforgeeks, This, is
错误和异常
1. 它有一个强异常保证,因此,如果抛出异常,不会进行任何更改
2. 参数应该与容器的类型相同,否则会抛出错误
// INTEGER EXAMPLE
// CPP program to illustrate
// Implementation of emplace() function
#include <iostream>
#include <set>
using namespace std;
int main()
{
multiset<int> mymultiset{};
mymultiset.emplace(1);
mymultiset.emplace(56);
mymultiset.emplace(4);
mymultiset.emplace(9);
mymultiset.emplace(0);
// multi set becomes 0, 1, 4, 9, 56
// adding another element
mymultiset.emplace(87);
// printing the multiset
for (auto it = mymultiset.begin();
it != mymultiset.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出:
0 1 4 9 56 87
// STRING EXAMPLE
// CPP program to illustrate
// Implementation of emplace() function
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
multiset<string> mymultiset{};
mymultiset.emplace("This");
mymultiset.emplace("is");
mymultiset.emplace("a");
mymultiset.emplace("computer science");
mymultiset.emplace("portal");
// multi set becomes This, a,
// computer science, is, portal
// adding element
mymultiset.emplace("GeeksForGeeks");
// printing the multiset
for (auto it = mymultiset.begin();
it != mymultiset.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出:
GeeksForGeeks This a computer science is portal
应用
使用emplace()函数输入以下数字和顺序的空多重集,并找到元素的总和。 emplace()的优点是它避免了对象的不必要复制。
输入 : 7, 9, 4, 6, 2, 5, 3
输出 : 36
// CPP 程序,演示
// emplace() 函数的应用
#include <iostream>
#include <set>
using namespace std;
int main()
{
// 声明 sum 变量
int sum = 0;
// 声明 multiset
multiset<int> mymultiset{};
mymultiset.emplace(7);
mymultiset.emplace(9);
mymultiset.emplace(4);
mymultiset.emplace(6);
mymultiset.emplace(2);
mymultiset.emplace(5);
mymultiset.emplace(3);
// 声明迭代器
set<int>::iterator it;
// 查找元素的总和
while (!mymultiset.empty()) {
it = mymultiset.begin();
sum = sum + *it;
mymultiset.erase(it);
}
// 打印总和
cout << sum;
return 0;
}
输出:
36
时间复杂度: O(logn)
emplace() vs insert()
使用 insert 时,我们创建好对象后再将其插入 multiset。而使用 emplace(),对象会原地构造。
// C++ 代码,演示 emplace 和 insert 的区别
#include<bits/stdc++.h>
using namespace std;
int main()
{
// 声明一个 pair 的 multiset
multiset<pair<char, int>> ms;
// 使用 emplace() 原地插入 pair
ms.emplace('a', 24);
// 下面这行无法编译通过
// ms.insert('b', 25);
// 使用 insert() 插入 pair
ms.insert(make_pair('b', 25));
// 打印 multiset
for (auto it = ms.begin(); it != ms.end(); ++it)
cout << " " << (*it).first << " "
<< (*it).second << endl;
return 0;
}
输出:
a 24
b 25