std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>:: emplace
|
template
<
class
...
Args
>
std:: pair < iterator, bool > emplace ( Args && ... args ) ; |
(C++23以降)
(C++26以降 constexpr) |
|
キーがコンテナ内に存在しない場合、与えられた args を使用してその場で構築された新しい要素をコンテナに挿入します。
t 型のオブジェクトを初期化し、 std:: pair < key_type, mapped_type > で std:: forward < Args > ( args ) ... を使用する。マップが既に t. first と等価なキーを持つ要素を含む場合、 * this は変更されない。それ以外の場合、以下と等価:
auto key_it = ranges::upper_bound(c.keys, t.first, compare); auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it); c.keys.insert(key_it, std::move(t.first)); c.values.insert(value_it, std::move(t.second));
このオーバーロードは、 std:: is_constructible_v < std:: pair < key_type, mapped_type > , Args... > が true の場合にのみ、オーバーロード解決に参加します。
value_type
が
EmplaceConstructible
ではなく、
args
から
flat_map
へ構築できない場合、動作は未定義です。
| イテレータの無効化に関する情報は こちら からコピーされています |
目次 |
パラメータ
| args | - | 要素のコンストラクタに転送する引数 |
戻り値
挿入された要素(または挿入を妨げた要素)へのイテレータと、挿入が行われた場合にのみ bool 値が true に設定されるペア。
例外
何らかの理由で例外がスローされた場合、この関数は何も効果を持ちません( strong exception safety guarantee )。
計算量
挿入が発生する場合、コンテナのサイズに対して線形時間、それ以外の場合、コンテナのサイズに対して対数時間
注記
emplace
の注意深い使用により、新しい要素を不必要なコピー操作やムーブ操作を回避しながら構築することが可能になります。
例
#include <iostream> #include <string> #include <utility> #include <flat_map> int main() { std::flat_map<std::string, std::string> m; // pairのムーブコンストラクタを使用 m.emplace(std::make_pair(std::string("a"), std::string("a"))); // pairの変換ムーブコンストラクタを使用 m.emplace(std::make_pair("b", "abcd")); // pairのテンプレートコンストラクタを使用 m.emplace("d", "ddd"); // 重複キーでのemplaceは効果なし m.emplace("d", "DDD"); // pairのピースワイズコンストラクタを使用 m.emplace(std::piecewise_construct, std::forward_as_tuple("c"), std::forward_as_tuple(10, 'c')); // 代替案: m.try_emplace("c", 10, 'c'); for (const auto& p : m) std::cout << p.first << " => " << p.second << '\n'; }
出力:
a => a b => abcd c => cccccccccc d => ddd
関連項目
|
ヒントを使用して要素をその場で構築する
(公開メンバ関数) |
|
|
キーが存在しない場合はその場で挿入し、キーが存在する場合は何もしない
(公開メンバ関数) |
|
|
要素を挿入する
(公開メンバ関数) |