2013-07-07 4 views
0

Я пытаюсь научиться использовать итератор с векторами в C++, например, вычисляя среднее значение вектора.Interator и среднее значение в C++

Однако этот код не дает правильного ответа, и я не могу понять, почему!

double average(vector<double> const &v) 
{ 
    vector<double>::size_type taille = v.size(); 
    double sum = 0; 
    for(vector<double>::const_iterator i = v.begin(); i != v.end(); ++i) 
     sum += v[*i]; 

    return sum/taille; 
} 

Может ли кто-нибудь дать мне подсказку?

Большое спасибо! Bye :)

+3

Кстати, вы можете разделить результат 'станд :: accumulate' по' размер () 'в случае реального кода. – chris

ответ

1

Доступ к элементам векселя через итератор - это просто *i, а не v[*i]. Форма вы использовали требует доступа с индексом:

for (size_t i = 0; i < v.size(); i++) sum += v[i]; 

И ваш код должен выглядеть следующим образом:

for(vector<double>::const_iterator i = v.begin(); i != v.end(); ++i) 
    sum += *i; 
      ^^^^ note this 
+0

Он работает! Большое спасибо! – Rivten

4

В C++ итераторы имитировать поведение указателей (до некоторой степени). Поэтому, если it является итератором для элемента, вы получаете доступ к элементу по разыменованию как *it.

Это означает, что вместо этого:

sum += v[*i]; 

вы должны написать следующее:

sum += *i; //just dereference the iterator! 

Надежда, что помогает.

+1

Это помогло! Благодаря ! – Rivten

1

Итератор фактически указывает на объект. Правильный способ итерации является:

double average(vector<double> const &v) 
{ 
    vector<double>::size_type taille = v.size(); 
    double sum = 0; 
    for(vector<double>::const_iterator i = v.begin(); i != v.end(); ++i) 
     sum += *it; 

    return sum/taille; 
} 

В C++ 11 вы можете сделать это слишком:

double average(vector<double> const &v) 
{ 
    double sum = 0; 
    for(const double &d : v) 
     sum += d; 

    return sum/v.size(); 
} 
Смежные вопросы