std::deque<T,Allocator>::emplace_back
来自cppreference.com
| (C++11 起) (C++17 前) |
||
| |
(C++17 起) | |
添加新元素到容器尾。元素通过 std::allocator_traits::construct 构造,通常用布置 new 于容器所提供的位置原位构造元素。实参 args... 以 std::forward<Args>(args)... 转发到构造函数。
所有迭代器(包括 end() 迭代器)都会失效。没有引用会失效。
参数
| args | - | 转发到元素构造函数的实参 |
| 类型要求 | ||
-T(容器的元素类型) 必须满足可就位构造 (EmplaceConstructible) 。
| ||
返回值
|
(无) |
(C++17 前) |
|
到被插入元素的引用。 |
(C++17 起) |
复杂度
常数。
异常
如果因为任何原因抛出了异常,那么此函数无效果(强异常安全保证)。
示例
下列代码用 emplace_back 追加 President 类型的对象到 std::deque。它演示 emplace_back 如何转发参数给 President 的构造函数,并展示如何用 emplace_back 避免用 push_back 时的额外复制或移动操作。
运行此代码
#include <deque>
#include <cassert>
#include <iostream>
#include <string>
struct President
{
std::string name;
std::string country;
int year;
President(std::string p_name, std::string p_country, int p_year)
: name(std::move(p_name)), country(std::move(p_country)), year(p_year)
{
std::cout << "我正被构造。\n";
}
President(President&& other)
: name(std::move(other.name)), country(std::move(other.country)), year(other.year)
{
std::cout << "我正被移动。\n";
}
President& operator=(const President& other) = default;
};
int main()
{
std::deque<President> elections;
std::cout << "emplace_back:\n";
auto& ref = elections.emplace_back("Nelson Mandela", "South Africa", 1994);
assert(ref.year == 1994 && "使用到所创建对象的引用 (C++17)");
std::deque<President> reElections;
std::cout << "\npush_back:\n";
reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));
std::cout << "\n内容:\n";
for (President const& president: elections) {
std::cout << president.name << " 是 "
<< president.country << " " << president.year << " 年的当选总统。\n";
}
for (President const& president: reElections) {
std::cout << president.name << " 是 "
<< president.country << " " << president.year << " 年的连任总统。\n";
}
}
输出:
emplace_back:
我正被构造。
push_back:
我正被构造。
我正被移动。
内容:
Nelson Mandela 是 South Africa 1994 年的当选总统。
Franklin Delano Roosevelt 是 the USA 1936 年的连任总统。
参阅
| 将元素添加到容器末尾 (公开成员函数) | |
(C++11) |
原位构造元素 (公开成员函数) |