我在java中有一个函数
static int a2(int[] a)
{
int sumEven = 0;
int sumOdd = 0;
for (int i=0; i<a.length; i++)
{
if (a[i]%2 == 0)
sumEven += a[i];
else
sumOdd += a[i];
}
return sumOdd - sumEven;
}
我在java中用main调用它,如
public static void main()
{
a2(new int[] {1});
a2(new int[] {1, 2});
a2(new int[] {1, 2, 3});
a2(new int[] {1, 2, 3, 4});
a2(new int[] {3, 3, 4, 4});
a2(new int[] {3, 2, 3, 4});
a2(new int[] {4, 1, 2, 3});
a2(new int[] {1, 1});
a2(new int[] {});
}
其中a2是函数,参数是数组。 我想用c ++实现同样的东西但是我不能像在java中传递的那样将数组传递给函数。以临时数组的地址给出错误[错误]。
在c ++中,我就是这样做的
f((int[4]) {1,2,3,4});
给出错误=&gt; [错误]获取临时数组的地址。
如何实现这一目标?
答案 0 :(得分:5)
使用std::vector
而不是处理低级数组:
int a2( const std::vector<int> &v )
{
return std::accumulate( v.begin(), v.end(), 0, []( int a, int b ) {
return a + ( b % 2 ? b : -b );
} );
}
int main()
{
a2( { 1, 2, 3 } );
}
答案 1 :(得分:2)
在C / C ++中,普通函数没有数组参数。虽然你可以写像
这样的东西void f(int a[]) { }
但是a会衰减到指针而不是数组。
但是如果你可以通过使用模板来解决这个问题
template <typename T, std::size_t N>
void f(const T (&a) [N]) {}
或正如其他人所说,std::vector
可能是更好的选择,甚至是std::array
。
例如,要使用临时数组,您可以执行此操作,
typedef int INTARRAY [];
f (INTARRAY{1, 2, 3, 4});
请注意,现在f
的声明已更改为使用const T
而不是T
。
答案 2 :(得分:1)
对数组的引用在C ++中的工作方式略有不同。函数签名需要更改为类似 *注意您可以添加const
以绑定到临时工具
int a2(int(&a)[3]){/*..*/}
对于大小为3的数组。也就是说,必须在编译时知道大小。
如果您想要使用不同大小的数组,请更改函数以接受指针和大小如此(在很多C风格的程序中使用):< / p>
int a2(int* a, int array_size){/*..*/}
或创建类似CS Pei提及的模板(可能是最好的方式,直接回答关于数组引用的问题)
template <class T, int N>
int a2(T (&a) [N]) {/*..*/}
答案 3 :(得分:1)
你在这里
#include <iostream>
template <size_t N>
int f( const int ( &a )[N] )
{
int sumEven = 0;
int sumOdd = 0;
for ( size_t i = 0; i < N; i++ )
{
if ( a[i] % 2 == 0 )
sumEven += a[i];
else
sumOdd += a[i];
}
return sumOdd - sumEven;
}
int main()
{
std::cout << f( {1} ) << std::endl;
std::cout << f( {1, 2} ) << std::endl;
std::cout << f( {1, 2, 3} ) << std::endl;
std::cout << f( {1, 2, 3, 4} ) << std::endl;
std::cout << f( {3, 3, 4, 4} ) << std::endl;
std::cout << f( {4, 1, 2, 3} ) << std::endl;
return 0;
}
程序输出
1
-1
2
-2
-2
-2
至于你使用表达式作为参数,例如这里
f((int[4]) {1,2,3,4});
然后
( int[4] ){ 1, 2, 3, 4 }
是在C中定义的复合文字,但未在C ++中定义。如果要编写一个使用复合文字的C程序,那么该函数必须有第二个参数来指定数组中的元素数。
例如
#include <stdio.h>
int f( int a[], size_t n )
{
int sumEven = 0;
int sumOdd = 0;
for ( size_t i = 0; i < n; i++ )
{
if ( a[i] % 2 == 0 )
sumEven += a[i];
else
sumOdd += a[i];
}
return sumOdd - sumEven;
}
int main( void )
{
printf( "%d\n", f( ( int[] ){1}, 1 ) );
printf( "%d\n", f( ( int[] ){1, 2}, 2 ) );
return 0;
}