2013-07-07 54 views
0

我想學習在C++中使用帶有向量的迭代器,例如計算向量的平均值。交互者和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; 
} 

有人能給我一個提示嗎?

非常感謝!再見:)

+3

順便說一句,你可以通過'大小劃分的'的std :: 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(); 
}