将值从STL矢量存储到另一个矢量

Storing values from STL vector to another vector

本文关键字:另一个 存储 STL      更新时间:2023-10-16

我一度陷入困境,需要一些帮助。

我有一个STL矢量,其值如下:

[1, 17, 2, 18, 3, 19, 1, 17, 2, 18, 3, 19, 1, 17, 2, 18, 3, 19].

注意,向量中的前六个值(即1、17、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)并继续。

我该如何做到这一点。。?

任何帮助都将不胜感激。

感谢

一旦你弄清楚了确切的映射,听起来就很容易了。外部循环是每个块中块的数量,因为这是最终组的数量,中间循环遍历每个原始块,而内部循环只遍历块中的每个元素。最终结果应该类似(未经测试):

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);

只需创建一个函数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)];