Я учусь использовать функторы вместе с алгоритмами STL для вычисления скалярного произведения двух векторов. Вот мои коды:
template<size_t DIM>
double Vector<DIM>::operator*(const Vector<DIM>& rhs) const {
double dotPro = 0;
std::for_each(vec, vec + DIM, std::bind2nd(dot_product<double>(rhs.get()), dotPro));
return dotPro;
}
/*vec is a double array and the data member of Vector class. I want to get the
dot product of rhs and *this by using std::for_each().
rhs.get()returns a const double* which is the start address of rhs's vec*/
/*The codes below define the functor. dotPro is passed as a reference so as to
it could be save the last result.*/
template<typename T>
struct dot_product: public std::binary_function<T, T, void> {
const T* arg;
sum(const T* dbl) : arg(dbl){};
void operator() (const T dbl, T& dotPro) {
dotPro += *arg++ * dbl;
}
};
Извините, я забыл свой вопрос …
Вопрос в том, что мой код не компилируется. Вот ошибка компиляции:
error: no match for call to '(const dot_product<double>) (const double&, const double&)'|
note: candidates are: void dot_product<T>::operator()(T, T&) [with T = double]|
И вот ошибка происходит в binders.h
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\backward\binders.h|147|error: return-statement with a value, in function returning 'void'|
Просто используйте станд :: inner_product:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <ostream>
#include <numeric>
#include <cstdlib>
#include <vector>
using namespace std;
int main()
{
vector<int> v1,v2;
generate_n( back_inserter(v1), 256, rand );
generate_n( back_inserter(v2), v1.size(), rand );
cout << inner_product( v1.begin(), v1.end(), v2.begin(), 0 ) << endl;
}
Да, это хорошее решение. Но я не хочу использовать методы, представленные в numeric.h.
Просто определите свой собственный dot_product:
template<typename InputIterator1,typename InputIterator2,typename ValueType>
ValueType dot_product( InputIterator1 first, InputIterator1 last, InputIterator2 another, ValueType init)
{
while(first!=last)
{
init += (*first) * (*another) ;
++first;
++another;
}
return init;
}
Других решений пока нет …