通过来自第一个向量的偶数索引和来自第二个向量的奇数索引将两个向量合并为第三个

时间:2015-04-22 15:26:14

标签: c++ vector merge

我正在尝试将两个向量合并为第三个向量,方法是复制/合并第一个偶数索引处的元素,然后复制/合并第二个奇数索引处的元素。

注意:两个向量都是二维的。

我有以下逻辑,但它似乎不起作用:

void pattern::mergePatters( void ) {
  cout<<"\n This is Merge Patters"<<endl;

  patter_input.reserve( patter_one.size() + patter_two.size() );

  for( int i=0;i<patter_one.size(); i++ ){
    for( int j =0; j<patter_one[i].size(); j++){
      if(j%2==0){
        patter_input.push_back( patter_one[j]);
      }
    }
      //cout<< " patter_one answers["<<i<<"]= " << answers_p1[i]<<endl;
  }

  for( int i=0;i<patter_two.size(); i++ ){
    for( int j =0; j<patter_two[i].size(); j++){
      if(j%2!=0){
        patter_input.push_back( patter_two[j]);
      }
    }
      //cout<< " patter_one answers["<<i<<"]= " << answers_p1[i]<<endl;
  }

}

void pattern::printMergePatters ( void ){
  cout<<"\n This is printMergePatters "<<endl;
  for ( int i=0;i<patter_input.size();i++){
    for( int j =0; j<patter_input[i].size(); j++){
      cout << " Merge Patter["<<i<<"]["<<j<<"]= " << patter_input[i][j]<<endl;
    }
  }
}

1 个答案:

答案 0 :(得分:0)

我建议您在一个循环中执行实际复制,而不是使用两个。使用patter_onepatter_two数组的迭代器可能会更容易,但我会使用索引。

const unsigned int total_size = patter_one.size() + patter_two.size();
patter_input.reserve(total_size);
unsigned int p1_index = 0U;
unsigned int p2_index = 0U;
for (unsigned int i = 0U; i < total_size; i += 2U)
{
  patter_input.push_back(patter_one[p1_index]);
  patter_input.push_back(patter_two[p2_index]);
  ++p1_index;
  ++p2_index;
}

注意循环的增量是2,因为每次迭代都会推送两个数组元素。

编辑1:复制奇数和偶数元素
要从patter_one复制偶数元素和从patter_two复制奇数元素,请更改索引初始化值和索引增量:

unsigned int p1_index = 0U;
unsigned int p2_index = 1U;
for (unsigned int i = 0U; i < total_size; i += 2U)
{
  patter_input.push_back(patter_one[p1_index]);
  patter_input.push_back(patter_two[p2_index]);
  p1_index += 2;
  p2_index += 2;
}

要求需要澄清,所以我提出了两种选择。保留金额可能不正确,具体取决于patter_onepatter_two向量的大小。上述片段仅复制patter_onepatter_two向量的一半,因此原始reserve数量可能不正确。

复制patter*向量的一半的保留金额为:

const unsigned int total_size = patter_one.size() / 2 // Only even items
                              + patter_two.size() / 2; // Only odd from here.