我坚持一点,需要一些帮助。
我有一个STL
向量,其中包含以下值:
[1, 17, 2, 18, 3, 19, 1, 17, 2, 18, 3, 19, 1, 17, 2, 18, 3, 19].
注意,矢量中的前六个值(即1,1,1,2,18,3,19)可以被认为是一个块。所以这个向量有3个块,每个块都有如上所述的值。
现在,我想以下列方式组织这个载体:
[1, 17, 1, 17, 1, 17, 2, 18, 2, 18, 2, 18, 3, 19, 3, 19, 3, 19]
所以基本上我首先从每个块中挑选前两个值(即1,17),然后按顺序存储它们3次(基本上是#块,在这种情况下是3)。然后我继续选择接下来的两个值(即2,18)并继续。
我如何实现这一目标??
非常感谢任何帮助。
由于
答案 0 :(得分:0)
一旦弄清楚确切的映射,听起来很容易。因此,外部循环是每个块中的块数,因为这是最终组的数量,中间循环遍历每个原始块,而内部循环只是遍历块的每个元素。最终结果应该是(未经测试的):
std::vector organized;
organized.reserve(data.size());
const int blockSize = 6;
const int subBlockSize = 2;
assert(data.size()%blockCount == 0 && blockSize%subBlockSize == 0);
const int blockCount = data.size()/blockSize;
const int subBlockCount = blockSize/subBlockSize;
for (int i = 0; i < subBlockCount; ++i)
for (int j = 0; j < blockCount; ++j)
for (int k = 0; k < subBlockSize; ++k)
organized.push_back(subBlockSize*i + blockSize*j + k);
答案 1 :(得分:0)
只需创建一个函数shuffle(i)
,它将索引放入新数组,并从原始数组中返回索引:
#include <iostream>
#include <cstdlib>
using namespace std;
int list[] = { 1, 17, 2, 18, 3, 19, 1, 17, 2, 18, 3, 19, 1, 17, 2, 18, 3, 19 };
int shuffle( int i )
{
div_t a = div( i, 6 );
div_t b = div( a.rem, 2 );
return 2*a.quot + 6*b.quot + b.rem;
}
int main()
{
for( int i=0 ; i<18 ; ++i ) cout << list[shuffle(i)] << ' ';
cout << endl;
return 0;
}
输出:
1 17 1 17 1 17 2 18 2 18 2 18 3 19 3 19 3 19
只需分配新的向量,然后从旧向量中填充:
new_vector[i] = list[shuffle(i)];