正在复制C++中数组中的奇数值元素

Copying odd-value elements from array in C++

本文关键字:元素 数组 复制 C++      更新时间:2023-10-16

我有以下代码:

int copyOddOnly(int *dest, int *src, int n) {
  int copyList = 0;
  for(int i = 0; i < n; i++) {
    if(src[i]%2!=0) {
        dest[i]=src[i];
        copyList = copyList + 1;
            }
        }
    return copyList; 
}

这意味着从数组src中获取所有具有奇数值的元素,并将它们复制到数组dest中。n是要从src复制到dest的元素数。它通过了除以下两项之外的大多数测试:

 int a[10] = {0};
  ASSERT_EQUALS(3,copyOddOnly(a,descending,5));
  ASSERT_EQUALS( "{5,4,3,2,1}",arrayToString(descending,5));
  ASSERT_EQUALS( "{5,3,1}",arrayToString(a,3));

  ASSERT_EQUALS(5,copyOddOnly(a,mix2,10));
  ASSERT_EQUALS( "{-42,12,-9,56,123,32767,48,12,-43,-43}",arrayToString(mix2,10));
  ASSERT_EQUALS( "{-9,123,32767,-43,-43}",arrayToString(a,5));

不是从arrayToString(a,3)复制{5,3,1},而是复制{5,0,3}。不是从arrayToString(a,5)中复制{912332767,-43,-43},而是复制{5,0,-9,023}。

当我写它的时候,我的第一反应是让它返回n,但由于某种原因,这让它在更多的测试中失败了。我有一种感觉,我没有得到一些基本的东西,我不知道是什么。如有任何帮助,我们将不胜感激。

而不是

dest[i]=src[i];

你可能想拥有

dest[copyList]=src[i];

当它只在奇数元素之间复制时,它只保留dest中与src的偶数元素相对应的元素。如果CCD_ 4是4,则最初在例如CCD_。

您需要跟踪沿着dest在循环中的距离。这将等效于函数中的copyList

int copyOddOnly(int *dest, int *src, int n) {
   int j = 0;
   for (int i = 0; i < n; i++) {
       if (src[i]%2 != 0) {
           dest[j] = src[i];
           j = j + 1;
        }
   }
   return j; 
}

首先要考虑的是,在C++的头<algorithm>中声明了标准算法std::copy_if。您的函数可能如下所示。

#include <algorithm>
//...
int copyOddOnly( int *dest, const int *src, int n ) 
{
    auto last = std::copy_if( src, src + n, dest, 
                              []( int x ) { return x % 2; } );
    return last - dest;
} 

如果你可能不使用标准算法,那么该功能可能看起来像

int copyOddOnly( int *dest, const int *src, int n ) 
{
    int k = 0;
    if ( !( n < 0 ) )
    {
        for ( int i = 0; i < n; i++ )
        {
            if ( src[i] % 2 != 0 ) dest[k++] = src[i];
        }
    }
    return k;
}