在 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}。
我在编写它时的第一直觉就是让它 return n,但由于某种原因,这使它无法通过更多测试。我有一种感觉,我没有得到一些基本的东西,我无法弄清楚是什么。任何帮助,将不胜感激。
而不是
dest[i]=src[i];
你可能想要
dest[copyList]=src[i];
虽然它只复制奇数元素,但它会保留 dest
中对应于 src
偶数元素的那些元素。无论价值最初是什么,例如如果 descending[1]
是 4,a[1]
将在复制后仍然存在。
您需要跟踪 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++中header<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;
}
我有以下代码:
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}。
我在编写它时的第一直觉就是让它 return n,但由于某种原因,这使它无法通过更多测试。我有一种感觉,我没有得到一些基本的东西,我无法弄清楚是什么。任何帮助,将不胜感激。
而不是
dest[i]=src[i];
你可能想要
dest[copyList]=src[i];
虽然它只复制奇数元素,但它会保留 dest
中对应于 src
偶数元素的那些元素。无论价值最初是什么,例如如果 descending[1]
是 4,a[1]
将在复制后仍然存在。
您需要跟踪 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++中header<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;
}