2017-01-04 8 views
0

やや単純な質問の、私はスタンダードを使用して、ベクトルの要素の順序を回転だ::回転:ベクター要素をベクトルサイズよりも大きな値で回転しますか?

std::vector<int> V {1,2,3,4}; 
std::rotate(V.rbegin(), V.rbegin() + K, V.rend()); 

//output: {4,1,2,3} 

I)は、Kが> = V.sizeある(セグメンテーションフォールトを取得しています、 1)なぜこのエラーが発生しているのですか? 2)このようなK値で回転操作を実行する方法は?例えば

、6のKべき出力{2,3,4,1}

+1

サンプルコードで 'K'を使用していません。 V.rend()を使うのではなく、V.end()を渡すことに深く疑念があります。 –

+1

[this](http://en.cppreference.com/w/cpp/algorithm/rotate)によると、この関数の前提条件は[first、n_first]と[n_first、last]が有効な範囲です._ –

答えて

5

KV.size()より大きい場合、V.rbegin()+Kは無効イテレータです。あなたはKのサイズを減らす必要があります。ような何か:

if (V.size() != 0) { 
    std::rotate(V.rbegin(), V.rbegin() + (K % V.size()), V.rend()); 
} 

size != 0最初のテストのために - そうでなければ、ゼロ除算を取得します。

+0

このマーティンありがとう! –

1

V.rebegin() + 6は有効なイテレータではありません。どの要素が指摘していますか?私はベクトルをK要素で回転させたいと仮定します。あなたがする必要があるのは、モジュロ演算子を適用して、どの値がベクタの前にあるかを調べることです。

std::vector<int> V {1,2,3,4}; 
const auto K = 4 % V.size(); 
std::rotate(V.rbegin(), V.rbegin() + K, V.rend()); 

なぜ6のKが{2,3,4,1}になるのかわからないのですが、それは{3,4,1,2}を与えます。おそらく、私はその質問を誤解しているでしょう。

編集:最初にサイズを確認することについてthis answerを参照してください。

+0

ありがとう! –

関連する問題