7

std::dequeいくつかのデータを含むランダム アクセス配列を表すプライベート クラス メンバーがあります。

std::vector<std::deque<SomeDataClass> > someMember;

deques の配列からすべてのデータ要素を含む、反復可能なデータ構造を返すパブリック クラス メソッドを提供したいと思います。

std::deque<SomeDataClass> someMethod();

このメソッドがベクター内のすべての両端キューを通過し、途中のすべての要素をローカル std::deque にコピーして、最終的にこのローカル std::deque を値で返すことを望みます。autoC++11とstd::begin(),を使用してこのメ​​ソッドを実装しようとしていますstd::end():

std::deque<SomeDataClass> MyClassName::someMethod(){
    std::deque<DirectedEdge> allDataItems;
    std::deque<DirectedEdge>::iterator deqIter = allDataItems.begin();
    for(auto it = std::begin(someMember); it != std::end(someMember); ++it){
        std::copy(std::begin(*it), std::end(*it), deqIter);
    }

    return allDataItems;
}

実行時に deque ヘッダーにデータ アクセス違反の未処理の例外エラーが表示されます。間違いとは何ですか?

4

2 に答える 2

13

std::copy()コピーを保持するのに十分な大きさの宛先範囲が必要ですが、allDataItems空です。事前にスペースを予約する必要がありますallDataItems(しかし、それは では不可能std::dequeです)。代わりにstd::back_inserter(で定義)を使用する必要があります。<iterator>

std::deque<SomeDataClass> MyClassName::someMethod(){
    std::deque<DirectedEdge> allDataItems;
    for(auto it = std::begin(someMember); it < std::end(someMember); ++it){
        std::copy(std::begin(*it), std::end(*it), std::back_inserter(allDataItems));
    }

    return allDataItems;
}
于 2013-07-16T07:42:53.717 に答える