2017-01-14 10 views
-2

こんにちは、私は次のstd ::ベクトルがあります。再配置int型のベクトルC++機能

std::vector<int> source ={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} 

私は例のn = 4のために与えられた数のために、このような出力ベクトルであるように、それをシャッフルしたい:

std::vector<int> output = {3,2,1,0,7,6,5,4,11,10,8,9,15,14,13,12} 

どのような機能をどのようにする必要がありますか?

+4

それは私にシャッフルのようには見えません。あなたは 'n 'のグループであなたの要素を逆にしたいですか?標準的なアルゴリズムはコンテナではなく「範囲」で動作するため、既存のアルゴリズム技術を使用して作成するのはかなり簡単です。 'std :: reverse'で演奏し、整数で算術演算をしてから、何が出てくるのかを見せてください。 –

+1

誰かが "賢い"と答えていない限り、これは答えます。 – LogicStuff

+2

@ mthe25どうすれば11,10,8,9を得ることができますか? –

答えて

2

コメントで述べたように、少しの努力で標準的なアルゴリズム関数で行うことができます。

using vector_size_t = std::vector<int>::size_type; 

std::vector<int> source = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }; 
std::vector<int> result = source; 

vector_size_t source_size = source.size(); 
vector_size_t group_size = 4; 

for(vector_size_t i = 0; i < source_size/group_size; ++i) 
{ 
    std::reverse 
    (
     std::next(std::begin(result), i * group_size), 
     std::next(std::begin(result), std::min((i + 1) * group_size, source_size)) 
    ); 
} 
+1

いくつかの場所で適切な型を使用していませんが、与えられた入力データに対してこれは十分です。 –

+1

'std :: min'だけでなく'(std :: min) 'なぜですか? – wally

+0

'unsigned i'ではなく' size_t i'を持つ方がよいかもしれません。 – wally