2016-10-12 5 views
1

ベクトルbacward_segmentのすべての要素を逆順でforward_segmentにプッシュする必要があります。ベクトルAからベクトルB(空ではない)を逆順に移動

これは私のコードです:

for(int q = backward_segment.size()-1; q >= 0; q--){ 
       forward_segment.push_back(backward_segment[q]); 
     } 

しかし、私はそれほど効率的ではないと思う..あなたは私に、より良い解決策を提案することはできますか?しかし、私はそれほど効率的ではないと思う

+1

あなたが使用することができ、 'のstd :: copy_if'、私はそれは'のstd :: reverse_copy'についての記事を読む – Slava

+2

それをより効率的になります疑います。 –

+0

移動したり、コピーしたりする必要がありますか? – Exagon

答えて

1

..

あなたはそのことについて、 "考える" べきではありません。代わりにプロファイラを使用してください。推測による最適化はほとんど働かない。

もっと良い解決策を提案できますか?

あなたはあまりにも多くの重複がスキップされることになるではない期待していた場合は、backward_segmentの大きさにforward_segmentの大きさを確保することができます。より完全なコピーをスキップするなど、アルゴリズムレベルで最適化を行うことは可能ですが、十分な情報は提供していません。

あなたはstd::unique_copyを使用することができます。

std::unique_copy(backward_segment.rbegin(), backward_segment.rend(), 
        std::back_inserter(forward_segment), 
        [](const auto &s1, const auto &s2) { 
         return s1.x == s2.x && s1.y == s2.y; 
        }); 

それは(私の意見では)それを読みやすくなりますが、compexityはほとんど同じになります。

4

コピーが十分

ある場合は、forward_segmentを初期化している場合、それはそう

vector<T> forward_segment(backward_segment.crbegin(), backward_segment.crend()); 

と同じくらい簡単です:あなたは、実際の要素に

使用を移動する必要がある場合

forward_segment.resize(backward_segment.size()); 
copy(backward_segment.crbegin(), backward_segment.crend(), forward_segment.begin()); 

make_move_iterator(constイテレータは使用していませんこの)。

初期化:そう

vector<T> forward_segment(
    make_move_iterator(backward_segment.rbegin()), 
    make_move_iterator(backward_segment.rend()) 
); 

forward_segment.resize(backward_segment.size()); 
copy(
    make_move_iterator(backward_segment.rbegin()), 
    make_move_iterator(backward_segment.rend()), 
    forward_segment.begin() 
); 

+0

そこに 'if'条件があります – Slava

+0

質問にはもう一つの必要はありません:*' bacward_segment'のベクトルから 'forward_segment'の逆順にすべての要素をプッシュする必要があります* – krzaq

+1

彼はまた、なぜあなたはそれを無視したのですか? – Slava

関連する問題