あなたはstd::vector<int>
で作業しているので、明白な答えを機能をまったく変更しないことです。
単に別の言葉で表してください。
foo(&some_vector[0], some_vector.size()); // assume some_vector is not const
これはあなたのCスタイルfoo()
への最初の要素とsome_vector
のサイズへのポインタを渡します。 std::vector
の要素は連続していることが保証されているので、これは要求どおりに動作します。
個人的には、私はそれをしません。私はイテレータを使用します。
#include <iterator>
int foo (std::vector<int>::iterator begin, std::vector<int>::iterator end)
{
// Do some stuff.
// Recur ignoring half of the input array.
std::advance(begin, std::distance(begin, end)/2);
return foo (begin, end);
}
// to call it
foo(some_vector.begin(), some_vector.end());
関数内で無限再帰を避けるためには、明らかにいくつかのロジックが必要です。しかし、それはあなたが始まった機能にも当てはまります。
テンプレートが
それはイテレータ(またはどこから来るの容器の種類)についてのハードコード仮定する必要がないため、より簡単でより一般的なの両方を作った私にはこれを許可
#include <iterator>
template<class Iterator>
int foo (Iterator begin, Iterator end)
{
// Do some stuff.
// Recur ignoring half of the input array.
std::advance(begin, std::distance(begin, end)/2);
return foo (begin, end);
}
// call like before
std::advance()
の要件そして、std::distance()
は非常に最小です - 本質的にイテレータは標準呼び出しのものです入力イテレータ(イテレータが指す各値が一度だけ読み込まれ、イテレータがインクリメントされる順次入力操作で使用できることを意味します) 。あなたの "Do stuff"コードはより制限的な要件を導入するかもしれません。
必要なチャンクの開始と終了のイテレーターを渡す –
@YuriyIvaskevychはい、それは可能ですが、機能の署名を変更する自由がない場合はどうなりますか? – Duh
'std :: vector'をお持ちの場合、サイズを渡す必要はありません。また、イテレータの範囲がある場合は、それを計算できます。 –