Я самостоятельно изучаю, как создавать универсальные функции с использованием итераторов. В качестве шага Hello World я написал функцию для получения среднего значения в данном диапазоне и возвращает значение:
// It is the iterator to access the data, T is the type of the data.
template <class It, class T>
T mean( It begin, It end )
{
if ( begin == end ) {
throw domain_error("mean called with empty array");
}
T sum = 0;
int count = 0;
while ( begin != end ) {
sum += *begin;
++begin;
++count;
}
return sum / count;
}
Мой первый вопрос: используется ли int
для счетчика в порядке, может ли он переполниться, если данные слишком длинные?
Я вызываю свою функцию из следующего тестового жгута:
template <class It, class T> T mean( It begin, It end );
int main() {
vector<int> v_int;
v_int.push_back(1);
v_int.push_back(2);
v_int.push_back(3);
v_int.push_back(4);
cout << "int mean = " << mean( v_int.begin(), v_int.begin() ) << endl;;
return 0;
}
Когда я компилирую это, я получаю ошибку:
error: no matching function for call to ‘mean(__gnu_cxx::__normal_iterator<int*,
std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*,
std::vector<int, std::allocator<int> > >)’
Спасибо!