2

std::vector単一の値を返す (仮想) 関数があります。クラスが次のようになっているとします。

#include <vector>

class Z; // irrelevant

class C
{
    Z& something;

public:
    typedef std::vector<Z*> list_type;

    virtual list_type f();
};

反復コンストラクターを使用する方が良いですか:

C::list_type C::f()
{
    return list_type(1, &something);
}

またはpush_back()単一の要素のみ:

C::list_type C::f()
{
    list_type ret;

    ret.push_back(&something);

    return ret;
}
4

4 に答える 4

2

「より良い」が「短いコード」であると考える場合、おそらく反復コンストラクターの方が短く、したがってより簡潔であるため、より優れています。

機能面では、どちらも同等です。

reserve()パフォーマンスの点では、反復コンストラクターは、割り当てようとしている要素の総数を事前に知っているので呼び出すことができるため、より優れている可能性があります。ただし、要素を作成するためだけに使用しているので、問題はないと思います。

于 2012-07-20T08:09:45.723 に答える
2

これらは基本的に機能的には同等ですがreturn list_type(1, &something);、ベクトルを目的の容量に直接事前に割り当て、さらに への呼び出しを回避するため、より効率的ですpush_back

于 2012-07-20T08:06:50.117 に答える
2

コンパイラが C++11初期化子リストを処理するのに十分新しい場合は、次のように使用できます。

C::list_type C::f()
{
    return list_type{&something};
}
于 2012-07-20T08:08:04.740 に答える
0

一般に、繰り返し形式を使用すると、要素vectorが正確に割り当てられN、指定された値で初期化されるため、より優れています (log2(N)繰り返しの場合に発生する時間の基になる配列の再割り当てと比較してpush_back())。

ただし、ポインターが 1 つだけの場合、違いはごくわずかです。またはを使用-O3すると、おそらくこれらの構造が同じアセンブリコードに変わります。

于 2012-07-20T08:14:28.853 に答える