JiaHeng-DLUT
8/12/2019 - 5:01 AM

emplace()

  • map 容器的成员函数 emplace() 可以在适当的位置直接构造新元素,从而避免复制和移动操作

  • 只有当容器中现有元素的键与这个元素的键不同时,才会构造这个元素。


  • 成员函数 emplace()insert() 返回的 pair 对象提供的指示相同。

  • pair 的成员变量 first 是一个指向插入元素或阻止插入的元素的迭代器;

  • 成员变量 second 是个布尔值,如果元素插入成功,second 就为 true

map<Name, size_t> people;
auto pr = people.emplace(Name{ "Dan", "Druff" }, 77);
auto iter = people.emplace_hint(pr.first, Name{ "Cal", "Cutta" }, 62);
#include <iostream>
#include <utility>
#include <string>
#include <map>
using namespace std;

int main() {
	map<string, string> m;

	// uses pair's move constructor
	m.emplace(make_pair(string("a"), string("a")));	// a => a

	// uses pair's converting move constructor
	m.emplace(make_pair("b", "abcd"));				// b => abcd

	// uses pair's template constructor
	m.emplace("d", "ddd");							// d => ddd

	// uses pair's piecewise constructor
	m.emplace(piecewise_construct,
		forward_as_tuple("c"),
		forward_as_tuple(10, 'c'));					// c => cccccccccc
	// as of C++17, m.try_emplace("c", 10, 'c'); can be used

	for (const auto& p : m) {
		cout << p.first << " => " << p.second << '\n';
	}
}