12

C++11から、次のように書くことができます

#include <vector>
#include <string>

struct S
{

    S(int x, const std::string& s)
        : x(x)
        , s(s)
    {
    }

    int x;
    std::string s;

};

// ...

std::vector<S> v;

// add new object to the vector v
// only parameters of added object's constructor are passed to the function
v.emplace_back(1, "t");

emplaceまたはemplace_backコンテナー クラス ( ) のような C++ 関数の C# 類似物はありますSystem.Collections.Generic.Listか?

更新: C# では、同様のコードがlist.EmplaceBack(1, "t");の代わりにとして記述される場合がありlist.Add(new S(1, "t"));ます。クラス名を覚えなくて、new ClassName毎回こういうシチュエーションで書いてくれるといいですね。

4

4 に答える 4

6

一般に、C# には同様のものはなく、その必要性は C++ よりもはるかに少なくなります。

C# の場合、List<SomeReferenceType>実際に持っているのは です。List<ReferenceToSomeType>つまり、各要素のサイズが 4 または 8 バイトの参照のリストです ( How big is an object reference in .NET? を参照してください)。参照をコピーしても、基になるオブジェクトが複製されることはないため、非常に高速です (約 4 または 8 バイトをコピーし、プロセッサはこの操作用に最適化されています。これは、プロセッサのネイティブ ポインタのサイズであるためです)。 )。したがって、あなたsomeList.Add(someReference)がしていることは、への参照を追加することですList<>

C++ では、 がある場合、各要素のサイズが に等しい のstd::vector<SomeType>ベクトルです。に新しい要素を挿入すると、挿入している要素が複製されます (複製、コピー... 好きな動詞を選択してください)。これはコストのかかる操作です。SomeTypesizeof(SomeType)std::vector<>

よく使用するパターンは、オブジェクトを に挿入するためだけにオブジェクトを作成するというものですstd::vector<>。C++11 でこの操作を最適化するために、2 つの方法を追加しました。メソッドと、移動セマンティックのstd::vector<>::emplaceサポートです。std::vector<>違いは、ムーブ セマンティックが型でサポートされている必要があることです (指定子SomeTypeを使用したムーブ コンストラクターが必要です)。noexceptemplace

于 2016-03-14T11:26:59.707 に答える
4

拡張機能を使用して、@ Boo バリアントを少し改善できます。Activator.CreateInstance
を使用してオブジェクト インスタンスを作成できるため、ソリューションがより一般的になります。

public static class ListExtension
{
    public static void Emplace<S>(this IList<S> list, params object[] parameters)
    {
        list.Add((S)Activator.CreateInstance(typeof(S), parameters));
    }
}

注: type および count パラメータはチェックされていないため、何か間違ったことをすると、実行時にエラーが発生します

于 2016-03-14T15:14:45.703 に答える
-1

C#では、拡張メソッドを使用して必要なものを実現できます

public static class ListExtension
{
    public static void Emplace(this IList<S> list, int x, string s)
    {
        list.Add(new S(x, s));
    }
}

次に、このように使用します

myList.Emplace(1,"t");
于 2016-03-14T11:24:04.263 に答える