Я самонаучаю, как создавать общие функции с помощью итераторов. В качестве шага Hello World, я написал функцию, чтобы взять среднее значение в заданном диапазоне и возвращает значение:проблема с написанием простой общей функции STL
// 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> > >)’
Спасибо!
Вам не нужен второй аргумент 'mean' be' v_int.end() '? Использование 'int' в качестве счетчика, вероятно, хорошо - когда оно переполняется, вы получите действительно огромный отрицательный результат. –
Вы правы, я просто пытался проверить свою ошибку. – recipriversexclusion