1

次のバグにより、std :: inner_product()をgccコンパイラ<gcc4.1コンパイラでインライン化しないとされています。

したがって、inner_productの独自のバージョンを実装したいと思います。利用可能な既存の実装はありますか?

ありがとう

4

2 に答える 2

2

C ++ヘッダーファイルを調べて定義を見つけ、「inline」キーワード(おそらく名前空間内)で再定義する必要があります。たとえば、私のヘッダーを見てください。

template <class T1, class T2, class T> inline T inner_product(T1 first1, T1 last1, T2 first2, T init)
{
  for (; first1 != last1; ++first1, ++first2) init = init + *first1 * *first2; return init;
}
于 2009-10-20T17:25:53.233 に答える
1

明らかな実装は次のようになります。

// warning: untested code:
template <class I1, class I2, class T>
T inline inner_product(I1 s1, I1 e1, I2 s2, T i) {
    while (s1!=e1) {
        i = i + ((*(s1)) * (*(s2)));
        ++(s1);
        ++(s2);
    }
    return i;
}

template <class I1, class I2, class T, class B1, class B2>
T inline inner_product(I1 s1, I1 e1, I2 s2, T i, B1 b1, B2 b2) {
    while (s1!=e1) {
        i=b1(i, b2(*(s1), *(s2)));
        ++(s1);
        ++(s2);
    }
    return i;
}

このような短い識別子を使用することはおそらく疑わしいですが、ヘッダーに存在するこのようなコードの場合、何億回もコンパイルされ、短い識別子は解析時間を節約します...

于 2009-10-20T17:46:20.133 に答える