C++ STL中的multiset::emplace()

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 教程