-2

ベクター内のコンストラクターを介して渡される値をコピーしようとしています。コードは次のとおりです。

class Foo {

public:
    template<typename T>
    Foo(T begin, T end)
    {
        std::copy(begin, end, data.begin());        
    }

    void printVector()
    {
        cout << data.size();
    }
protected:
    std::vector<double> data;
};

そしてメイン:

std::vector<double> data = {
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};

Foo::Foo f(

    std::begin(data),
    std::begin(data)
);

f.printVector();

誰かがなぜこれがうまくいかないのか説明してもらえますか? また、std::vector<vector<double> > data2D ベクトルがあり、2D ベクトルの反復子を渡した場合、これを 2D ベクトルにコピーすることはできますか?

ありがとう

4

3 に答える 3

5

まず、ベクターデータメンバーにはサイズ0があるため、あなたstd::copyのやり方ではできません。コンストラクターの初期化リストを使用して、2 つの反復子からデータ メンバーを初期化する必要があります。

template<typename T>
Foo(T begin, T end) : data(begin, end) {}

次に、要素をコピーしようとしていません。これは完全に壊れています:

Foo::Foo f(
  std::begin(data),
  std::begin(data)
);

それはおそらく

Foo f(std::begin(data), std::end(data));
于 2013-08-16T09:42:27.073 に答える
2

スペースを割り当てる必要がありvector::beginますが、それはあなたのために行われません。を使用することもできますpush_back_inserter

さらに、 に Give をstd::begin(data)2 回使用しFooます。

于 2013-08-16T09:42:31.323 に答える
2

あなたが持っている

Foo::Foo f(

    std::begin(data),
    std::begin(data)
);

もしかして

Foo::Foo f(

    std::begin(data),
    std::end(data)  //<- note the change
);

また、コンストラクターでコピー先のスペースを作成していないため、back_inserter

std::copy(begin, end, std::back_inserter(data)); 
于 2013-08-16T09:44:26.237 に答える