簡體   English   中英

在C ++中從數組復制奇數值元素

[英]Copying odd-value elements from array in C++

我有以下代碼:

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)復制{-9,123,32767,-43,-43},而是復制{5,0,-9,0,123}。

編寫它時,我的第一個直覺是讓它返回n,但是由於某種原因,它無法通過更多測試。 我有一種感覺,我沒有掌握一些基本的知識,也無法弄清楚是什么。 任何幫助,將不勝感激。

代替

dest[i]=src[i];

你可能想擁有

dest[copyList]=src[i];

雖然它僅跨奇數個元素進行復制,但是dest對應於src偶數個元素的dest元素。 如果descending[1]為4,則復制后在a[1]原來保留的任何值仍然存在。

您需要跟蹤循環中的dest距離。 這將等效於copyList中的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM