39

次のクラスがあるとします。

class MyInteger {
private:
  int n_;
public:
  MyInteger(int n) : n_(n) {};
  // MORE STUFF
};

そして、このクラスにはデフォルトの自明なコンストラクターがないとしますMyInteger()int何らかの理由で初期化するために常に を提供する必要があります。そして、コードのどこかでvector<MyInteger>. MyIntegerこれで各コンポーネントを初期化するにはどうすればよいvector<>ですか?

関数内の通常の変数の 2 つの状況 (おそらく解決策は同じですが、とにかく説明します) があります。

int main(){
    vector<MyInteger> foo(10);  //how do I initialize each 
                                //MyInteger field of this vector? 
    doStuff(foo);
}

クラス内のデータとして:

class MyFunClass {
private:
   vector<MyInteger> myVector;

public:
   MyFunClass(int size, int myIntegerValue) : myVector(size) {}; 
   // what do I put here if I need the 
   // initialization to call MyInteger(myIntegerValue) for all 
   // components of myVector?
};

初期化リストでそれを行うことは可能ですか、それとも MyFunClass(int, int) コンストラクターで手動で初期化を記述する必要がありますか?

これは非常に基本的なことのように思えますが、どういうわけか本の中でそれを見逃しており、Web で見つけることができません。

4

5 に答える 5

40

そこにたどり着く方法はたくさんあります。以下にその一部を示します (順不同)。

vector(size_type n, const T& t)コンストラクターを使用します。nのコピーでvector を初期化しますt。例えば:

#include <vector>

struct MyInt
{
    int value;
    MyInt (int value) : value (value) {}
};

struct MyStuff
{
    std::vector<MyInt> values;

    MyStuff () : values (10, MyInt (20))
    {
    }
};

要素を 1 つずつベクターにプッシュします。これは、値が異なる場合に役立ちます。例えば:

#include <vector>

struct MyInt
{
    int value;
    MyInt (int value) : value (value) {}
};

struct MyStuff
{
    std::vector<MyInt> values;

    MyStuff () : values ()
    {
        values.reserve (10); // Reserve memory not to allocate it 10 times...
        for (int i = 0; i < 10; ++i)
        {
            values.push_back (MyInt (i));
        }
    }
};

C++0x がオプションの場合、別のオプションはコンストラクター初期化リストです。

#include <vector>

struct MyInt
{
    int value;
    MyInt (int value) : value (value) {}
};

struct MyStuff
{
    std::vector<MyInt> values;

    MyStuff () : values ({ MyInt (1), MyInt (2), MyInt (3) /* ... */})
    {
    }
};

もちろん、デフォルトのコンストラクターを提供したり、 以外のものを使用したりするオプションがありますstd::vector

それが役に立てば幸い。

于 2011-05-26T17:59:14.753 に答える
12

ベクトルの要素がデフォルトで構築可能でない場合、ベクトルで実行できないことがいくつかあります。これを書くことはできません (例 1):

vector<MyInteger> foo(10);

ただし、次のように書くこともできます (例 2)。

vector<MyInteger> foo(10, MyInteger(37));

(これにはコピー コンストラクターのみが必要です。) 2 番目の引数は、ベクターの要素の初期化子です。

あなたの場合、次のように書くこともできます。

vector<MyInteger> foo(10, 37);

... MyInteger には、「int」を引数として取る非明示的なコンストラクターがあるためです。したがって、コンパイラは 37 を MyInteger(37) にキャストし、例 2 と同じ結果を返します。

std::vectorのドキュメントを調べてください。

于 2011-05-26T17:53:42.797 に答える
6

質問に非常によく答えたすべての回答に加えて、クラス MyInteger がコピー構築可能でない場合、このトリックを使用できます。作成する代わりに、作成vector< MyInteger>できますvector< shared_ptr< MyInteger > >

于 2011-05-26T18:19:28.047 に答える
6
vector<MyInteger> foo(10, MyInteger(MY_INT_VALUE));

MyFunClass(int size, int myIntegerValue) : myVector(size, MyInteger(myIntegerValue)) {}; 
于 2011-05-26T17:53:52.703 に答える