ネストされたオブジェクトの最適化を使用したc ++ emplace_back

初心者

emplace_backの動作について少し混乱しました。みてみましょう。

struct innerObject
{
    innerObject(int );
};

class outterObject
{
    innerObject member;
public:
    outterObject(innerObject member);
};

int main()
{
    std::vector<outterObject> v1;
    v1.emplace_back(5);
}

したがって、この場合、整数を渡すことができ、それは機能します。

1つだけではなく2つを構築するinnerObject必要がある場合、コンストラクターはどうですか?私が試した他の組み合わせも機能しませどういうわけか可能ですか?そのようなものを作るためのより良いオプションはありますか?(最適化) intv1.emplace_back(5,5)v1.emplace_back({5,5})

バリー

あらゆる種類のコピー/移動を回避する唯一の方法は、一般化されたコンストラクターを提供することにより、外部タイプがその種の操作にオプトインすることです。

template <typename A0, typename... Args,
    std::enable_if_t<
        !std::is_same_v<std::decay_t<A0>, outterObject> &&
        std::is_constructible_v<outterObject, A0, Args...>
        , int> = 0>
outterObject(A0&& a0, Args&&... args)
    : member(std::forward<A0>(a0), std::forward<Args>(args)...)
{ }

これにより、2から構築v1.emplace_back(10, 20)可能である場合innerObject書き込むことができますint

それがやり過ぎのように思われる場合は、いつでも行うことができますv1.push_back({{10, 20}})push_back()は異なりemplace_back()、引数の型を推測しないこと注意してください。これT const&またはT&&です。これにより、を使用できます{}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

std :: vector :: emplace_backの使用

分類Dev

std :: vectorのemplace_back

分類Dev

push_back()とemplace_back()の舞台裏

分類Dev

ベクトルemplace_backの混乱

分類Dev

ベクトルPush_BackVS Emplace_Back

分類Dev

vector <struct>のC ++ 11 emplace_back?

分類Dev

c++ emplace_back with nested objects optimization

分類Dev

std :: moveを使用したC ++ 11 push_back()と、すでに構築されたオブジェクトのemplace_back()の効率

分類Dev

push_backまたはemplace_backとstd :: make_unique

分類Dev

プリミティブ型のemplace_backとpush_back

分類Dev

unique_ptrからのリストのemplace_back

分類Dev

std :: stringにemplaceまたはemplace_backがないのはなぜですか?

分類Dev

emplace_back()で内部構造体を初期化しています

分類Dev

push_back / emplace_backオブジェクトの浅いコピーを別のベクトルに

分類Dev

emplace_backパラメータの値を変更します

分類Dev

std :: vector :: emplace_backへの引数としてのラムダ

分類Dev

vector <vector <int >>にstd :: vector :: emplace_backを使用する方法は?

分類Dev

std :: vector :: eraseのMoveAssignable要件とstd :: vector :: emplace_backのMoveInsertable要件

分類Dev

emplace_backがstd :: vector <std :: map <int、int >>で機能しない

分類Dev

std :: vector <> :: emplace_back()の例外は安全ですか?

分類Dev

std :: vectorにペアを挿入するときのemplace_back()とpush_back

分類Dev

make_uniqueとemplace_backを使用した単純な構造体

分類Dev

vector :: emplace_backデストラクタを2回呼び出す結果

分類Dev

コピー不可能な構成可能なオブジェクトの場合はstd :: vector emplace_back()

分類Dev

C ++ユーザー定義構造にemplace_backを使用する方法

分類Dev

参照を返すときのstd :: vector :: emplace_backのバグ(C ++ 17)

分類Dev

std :: emplace_backは、ベクター内の他のオブジェクトのコンストラクターを呼び出しますか?

分類Dev

emplace_back( "Hello")がstrlenを呼び出すのはなぜですか?

分類Dev

このstd :: vector :: emplace_backが失敗するのはなぜですか?

Related 関連記事

  1. 1

    std :: vector :: emplace_backの使用

  2. 2

    std :: vectorのemplace_back

  3. 3

    push_back()とemplace_back()の舞台裏

  4. 4

    ベクトルemplace_backの混乱

  5. 5

    ベクトルPush_BackVS Emplace_Back

  6. 6

    vector <struct>のC ++ 11 emplace_back?

  7. 7

    c++ emplace_back with nested objects optimization

  8. 8

    std :: moveを使用したC ++ 11 push_back()と、すでに構築されたオブジェクトのemplace_back()の効率

  9. 9

    push_backまたはemplace_backとstd :: make_unique

  10. 10

    プリミティブ型のemplace_backとpush_back

  11. 11

    unique_ptrからのリストのemplace_back

  12. 12

    std :: stringにemplaceまたはemplace_backがないのはなぜですか?

  13. 13

    emplace_back()で内部構造体を初期化しています

  14. 14

    push_back / emplace_backオブジェクトの浅いコピーを別のベクトルに

  15. 15

    emplace_backパラメータの値を変更します

  16. 16

    std :: vector :: emplace_backへの引数としてのラムダ

  17. 17

    vector <vector <int >>にstd :: vector :: emplace_backを使用する方法は?

  18. 18

    std :: vector :: eraseのMoveAssignable要件とstd :: vector :: emplace_backのMoveInsertable要件

  19. 19

    emplace_backがstd :: vector <std :: map <int、int >>で機能しない

  20. 20

    std :: vector <> :: emplace_back()の例外は安全ですか?

  21. 21

    std :: vectorにペアを挿入するときのemplace_back()とpush_back

  22. 22

    make_uniqueとemplace_backを使用した単純な構造体

  23. 23

    vector :: emplace_backデストラクタを2回呼び出す結果

  24. 24

    コピー不可能な構成可能なオブジェクトの場合はstd :: vector emplace_back()

  25. 25

    C ++ユーザー定義構造にemplace_backを使用する方法

  26. 26

    参照を返すときのstd :: vector :: emplace_backのバグ(C ++ 17)

  27. 27

    std :: emplace_backは、ベクター内の他のオブジェクトのコンストラクターを呼び出しますか?

  28. 28

    emplace_back( "Hello")がstrlenを呼び出すのはなぜですか?

  29. 29

    このstd :: vector :: emplace_backが失敗するのはなぜですか?

ホットタグ

アーカイブ