STL unordered_multiset emplace

STL unordered_multiset emplace教程

如果我们需要向 STL 中的 unordered_multiset 容器插入元素除了使用 insert 方法插入元素,还可以使用 emplace 方法和 emplace_hint 方法。

实现相同的插入操作,无论是用 emplace() 还是 emplace_hint(),都比 insert() 方法的效率高,和 insert() 方法相比,emplace() 和 emplace_hint() 方法的使用要简单很多,因为它们各自只有一种语法格式。

STL unordered_multiset emplace详解

语法

template <class... Args> pair<iterator,bool> emplace (Args&&... args);

说明

参数 (Args&&… args) 指的是,只需要传入构建新元素所需的数据即可,该方法可以自行利用这些数据构建出要添加的元素。比如,若 unordered_multiset 容器中存储的元素类型为自定义的结构体或者类,则在使用 emplace() 方法向容器中添加新元素时,构造新结构体变量(或者类对象)需要多少个数据,就需要为该方法传入相应个数的数据。

返回值

该方法的返回值类型为 pair 类型,其包含 2 个元素,一个迭代器和一个 bool 值:当该方法将目标元素成功添加到 unordered_multiset 容器中时,其返回的迭代器指向新插入的元素,同时 bool 值为 true;

当添加失败时,则表明原 unordered_multiset 容器中已存在相同值的元素,此时返回的迭代器指向容器中具有相同键的这个元素,同时 bool 值为 false。

STL unordered_multiset emplace_hint详解

语法

template <class... Args> iterator emplace_hint (const_iterator position, Args&&... args);

说明

和 emplace() 方法相比,有以下 2 点不同:该方法需要额外传入一个迭代器,用来指明新元素添加到 unordered_multiset 容器的具体位置(新元素会添加到该迭代器指向元素的前面);

返回值是一个迭代器,而不再是 pair 对象。当成功添加元素时,返回的迭代器指向新添加的元素;反之,如果添加失败,则迭代器就指向 unordered_multiset 容器和要添加元素的值相同的元素。

案例

unordered_multiset emplace插入元素

使用 emplace 给 unordered_multiset 插入元素

#include <iostream> #include <unordered_set> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; std::unordered_multiset<string>myunordered_multiset; myunordered_multiset.emplace("CPP教程"); for(auto iter = myunordered_multiset.begin(); iter != myunordered_multiset.end(); ++iter) { cout << *iter << endl; } cout << "==================================================" << endl; myunordered_multiset.emplace("C语言教程"); for(auto iter = myunordered_multiset.begin(); iter != myunordered_multiset.end(); ++iter) { cout << *iter << endl; } cout << "==================================================" << endl; myunordered_multiset.emplace("Golang教程"); for(auto iter = myunordered_multiset.begin(); iter != myunordered_multiset.end(); ++iter) { cout << *iter << endl; } return 0; }

因为,这里需要使用 C++ 11,因此,我们在 Linux 下使用 g++ 进行编译,具体命令如下:

g++ unordered_multiset.cpp -std=c++11

编译后,我们直接运行生成的二进制文件 a.out,如下图所示:

57_unordered_multiset插入元素.png

我们看到,我们使用了 emplace 将元素插入到了 unordered_multiset 中。

unordered_multiset emplace_hint插入元素

使用 emplace_hint 给 unordered_multiset 插入元素

#include <iostream> #include <unordered_set> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; std::unordered_multiset<string>myunordered_multiset; myunordered_multiset.emplace_hint(myunordered_multiset.begin(), "CPP教程"); for(auto iter = myunordered_multiset.begin(); iter != myunordered_multiset.end(); ++iter) { cout << *iter << endl; } cout << "==================================================" << endl; myunordered_multiset.emplace_hint(myunordered_multiset.begin(), "C语言教程"); for(auto iter = myunordered_multiset.begin(); iter != myunordered_multiset.end(); ++iter) { cout << *iter << endl; } cout << "==================================================" << endl; myunordered_multiset.emplace_hint(myunordered_multiset.begin(), "Golang教程"); for(auto iter = myunordered_multiset.begin(); iter != myunordered_multiset.end(); ++iter) { cout << *iter << endl; } return 0; }

编译后,我们直接运行生成的二进制文件 a.out,如下图所示:

58_unordered_multiset插入元素.png

我们看到,我们使用了 emplace_hint 将元素插入到了 unordered_multiset 中。

STL unordered_multiset emplace总结

如果我们需要添向 STL 中的 unordered_multiset 容器插入元素除了使用 insert 方法插入元素,还可以使用 emplace 方法和 emplace_hint 方法。

实现相同的插入操作,无论是用 emplace() 还是 emplace_hint(),都比 insert() 方法的效率高,和 insert() 方法相比,emplace() 和 emplace_hint() 方法的使用要简单很多,因为它们各自只有一种语法格式。