2011-01-30 16 views
1

配列を関数に送りたいです!関数内のC++配列

私は、PHPプログラマので、私はPHPでの例を記述し、C++に変換してください。

function a($x) { 
    foreach ($x as $w) print $w; 
} 

$test = array(1, 2, 3); 
a($test); 

答えて

11

これを行うための最善の方法は、関数はイテレータのペアを取ることです。範囲と(実際には範囲の「終わり過去1」である)の範囲の最後に1の先頭に1:

template <typename ForwardIterator> 
void f(ForwardIterator first, ForwardIterator last) 
{ 
    for (ForwardIterator it(first); it != last; ++it) 
     std::cout << *it; 
} 

、あなたはその範囲かどうか、任意の範囲で、この関数を呼び出すことができます配列または文字列または他のタイプの配列からのものです。

// You can use raw, C-style arrays: 
int x[3] = { 1, 2, 3 }; 
f(x, x + 3); 

// Or, you can use any of the sequence containers: 
std::array<int, 3> v = { 1, 2, 3 }; 
f(v.begin(). v.end()); 

詳細については、自分自身を取得することを検討してくださいa good introductory C++ book

+1

+1:特に最後に発言しました。 C++は実験で探検すれば悪夢になることがあります。リンクが正しいと確信していますか? boost :: bindを指しています。 – 6502

+0

@ 6502:おっと!ヘッドアップをありがとう。コピー&ペーストは失敗します。 –

+4

良いことそれはポルノを好きではなかった – Marlon

2

この方法試してください:最初のものは、実際のアレイを使用して、コンパイル時に知られているので、配列の長さを指定する必要はありません

int a[3]; 
a[0]=1; 
a[1]=... 

void func(int* a) 
{ 
    for(int i=0;i<3;++i) 
     printf("%d",a++); 
} 
+0

これはC言語ではなくC言語です。 –

+1

@Paul R:これは完全に有効なC++ですが、普通は慣用的なC++とは考えられません。 –

+0

@Greg:私の知るところですが、私の主張は、C++の新参者の例を与えるのは非常に誤解を招いています。実際のCコードは、より適切で慣用的なC++ではなくC++としてコンパイルされます。私は今日投票が残っていればこの回答を投票します。 –

1
template <typename T, size_t N> 
void functionWithArray(T (&array)[N]) 
{ 
    for (int i = 0; i < N; ++i) 
    { 
     // ... 
    } 
} 

又は

void functionWithArray(T* array, size_t size) 
{ 
    for (int i = 0; i < size; ++i) 
    { 
     // ... 
    } 
} 

を時間。 2番目はメモリブロックを指しているので、サイズを指定する必要があります。

これらの機能は、2つの異なる方法で使用することができる。

int x[] = {1, 2, 3}; 
functionWithArray(x); 

と:

int* x = new int[3]; 
x[0] = 1; 
x[1] = 2; 
x[2] = 3; 
functionWithArray(x, 3);