template <class... Args>
iterator emplace(const_iterator position, Args&&... args); // (1) C++11
template <class... Args>
constexpr iterator emplace(const_iterator position, Args&&... args); // (1) C++26
概要
任意の位置に要素を直接構築で挿入する
要件
要素型 value_type は、引数 args からコンテナに対して EmplaceConstructible でなければならない。また、要素型 value_type はコンテナに対して、MoveInsertable であり、かつ、MoveAssignable でなければならない。
効果
std::forward<Args>(args)... で構築された value_type 型のオブジェクトを position の手前に挿入する。
戻り値
挿入された要素を指すイテレータ
計算量
dequeの要素数に対して線形時間、先頭もしくは末尾への挿入は定数時間
備考
- 例外発生時に副作用が発生しない保証は
insert()と同様。 - 引数
argsがこのコンテナ自身の要素を参照する場合の扱いは、バージョンによって以下のように異なる:- C++17まで : 引数
argsがコンテナ自身の要素を参照する場合の動作は規定されていない - C++20 : 引数
argsは、このコンテナ自身の要素を直接的または間接的に参照してもよい。たとえばc.emplace(c.begin(), c.back())のように、末尾要素を先頭に挿入する操作も正しく動作する
- C++17まで : 引数
例
#include <iostream>
#include <deque>
#include <utility>
#include <string>
int main()
{
std::deque<std::pair<int, std::string>> c;
c.emplace(c.begin(), 3, std::string("hello"));
c.insert(c.begin(), std::make_pair(1, std::string("world")));
for (const auto& x : c) {
std::cout << x.first << ',' << x.second << std::endl;
}
}
出力
1,world
3,hello
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.2 ✅
- Visual C++: 2012 ✅, 2013 ✅
- 2010にも
emplaceは存在するが、insert相当の機能しかない。
- 2010にも
関連項目
| 名前 | 説明 |
|---|---|
insert |
任意の位置に要素を挿入する |
参照
- N2345 Placement Insert for Containers (Revision 2)
- LWG Issue 2252. Strong guarantee on
vector::push_back()still broken with C++11?- 経緯の説明は、
vector::push_back()ページを参照。
- 経緯の説明は、
- P3372R3 constexpr containers and adaptors
- LWG Issue 2164. What are the semantics of
vector.emplace(vector.begin(), vector.back())?- C++20で、引数がコンテナ自身の要素を参照してもよいことが明確化された