4

C++ のいくつかの機能 (for_each、マッピング関数、反復子の使用など) について頭を悩ませることはできましたが、汎用コンテナーと反復子を取り込むためのテンプレートと関数引数リストの構築は、まだわかりません。私は誰かが私のために説明できることを望んでいる実用的な例を持っています:

着信 std::vector を処理し、プロセスの多くのデータポイント/反復の実行中の合計を構築する次の関数を使用します。

/* the for-loop method - not very savvy */
void UpdateRunningTotal (int_vec& total, int_vec& data_point) {
  for (int i = 0; i < V_SIZE; i++) {
    total[i] += data_point[i];
  }
}

typedef int_vec std::vector<int>;
int_vec running_total (V_SIZE, 0);  // create a container to hold all the "data points" over many iterations
/* further initialization, and some elaborate loop to create data points */

UpdateRunningTotal (running_total, iteration_data);
/* further processing */

上記は機能しますが、イテレータを取り、この合計を実行する関数が必要です。さらに良いことに、コンテナーの型を指定する代わりに、推測される型を含むジェネリック パラメーター リストを用意します。つまり、次のようになります。

UpdateRunningTotal (iteration_data.begin(), iteration_data.end(), running_total.begin());

この時点で私は本当に迷っており、テンプレートと引数リストを定義して関数を汎用にする方法を見つけるための少しのガイダンスが必要です。テンプレートと関数の定義はどのようになりますか? 私は、STL 機能を使用してこの特定のタスクを実行する方法に既に精通しています。一般的な関数/テンプレート定義の図を探しています。

4

2 に答える 2

7

std::transformとを使用できますstd::plus

std::transform(iteration_data.begin(), iteration_data.end(),
                running_total.begin(), iteration_data.begin(), std::plus<int>());

そして、あなたの機能では、それは次のようになります:

template <typename Iter1, typename Iter2>
void UpdateRunningTotal(Iter1 pBegin, Iter1 pEnd, Iter2 pBegin2)
{
    typedef typename std::iterator_traits<Iter1>::value_type value_type;

    std::transform(pBegin, pEnd, pBegin2, pBegin, std::plus<value_type>());
}
于 2010-06-07T17:40:57.843 に答える
1

さて、私はあなたの仕様が今私には意味をなさないので、正しい実装で埋めなければならない関数の署名をあなたに与えることができます.


template < typename InputIterator, typename OutputIterator >
?? UpdateRunningTotal(InputIterator beg, InputIterator end, OutputIterator dest)
{
}
于 2010-06-07T17:43:16.200 に答える