将STL向量的值存储到另一个向量

时间:2013-12-06 16:32:18

标签: c++ arrays loops vector stl

我坚持一点,需要一些帮助。

我有一个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)并继续。

我如何实现这一目标??

非常感谢任何帮助。

由于

2 个答案:

答案 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)];