2013-10-14 28 views
1

編寫一個函數可以給出最大值以及向量數組中的相應索引,這是不難的,如下面的代碼所示:一個用於獲得最大值的模板函數及其在矢量中的相應索引

using namespace std; 



std::vector<double> line_weighting; 
line_weighting.push_back(22); 
line_weighting.push_back(8); 
line_weighting.push_back(55); 
line_weighting.push_back(19); 



std::vector<double>::iterator it = std::max_element(line_weighting.begin(),line_weighting.end()); 
int index = distance(line_weighting.begin(),it); 
value = *it; 

我更感興趣的是使用模板更一般的功能,可以執行同樣的功能:

template<typename T> 
    int max_with_index(const std::vector<T> &weighting, T &max_value) 
    { 
     std::vector<T>::iterator it = max_element(weighting.begin(),weighting.end()); 
     max_value = *it; 
     return (std::distance(weighting.begin(),it)); 
    } 

但是,此功能無法編譯,因爲它在VC2010以下錯誤:

Error 2 error C2782: 'iterator_traits<_Iter>::difference_type std::distance(_InIt,_InIt)' : template parameter '_InIt' is ambiguous 
Error 1 error C2440: 'initializing' : cannot convert from 'std::_Vector_const_iterator<_Myvec>' to 'std::_Vector_iterator<_Myvec>' 

我知道如果我這樣寫這個函數,它可以工作。

template<typename T> 
    int max_with_index(const std::vector<T> &weighting, T &max_value) 
    { 
     // std::vector<T>::iterator it = max_element(weighting.begin(),weighting.end()); 
     auto it= max_element(weighting.begin(),weighting.end()); 
     max_value = *it; 
     return (std::distance(weighting.begin(),it)); 
    } 

但我不明白爲什麼我的原始實現有編譯錯誤,我可以做些什麼來糾正它?

+0

爲什麼你會不會讓這個普通的在一定範圍內(一對迭代器)而不是一個更有限的向量? –

+0

@ DavidRodríguez - dribeas我不明白你指的是什麼,你能舉個例子嗎? – feelfree

+0

你正試圖寫一個幫手來避免寫什麼,3行代碼?但不是提供一個通用的解決方案,你只提供一個用於'std :: vector' ...另一個'template typename Iterator :: difference_type max_with_index(Iterator first,Iterator last,Iterator :: value_type&max)'would可用於不同的容器('std :: deque','std :: array',原始數組)。我沒有看到使用默認分配器將使用限制爲只有'std :: vector'的價值... –

回答

2

您正在嘗試比較不同類型的迭代器,你需要使用const_iterator作爲weighting常量

std::vector<T>::const_iterator it = max_element(weighting.begin(),weighting.end()); 

這就是爲什麼auto是C++ 11那麼好。

+0

謝謝,它的工作原理。我經常與const_iterator和const迭代器混淆。 – feelfree

+0

如果可以,請使用'auto'關鍵字。 – user1095108

1

向量有兩種類型的迭代器,const_iterator和常規iterator,這些是不同的類型,因此不能從一個轉換到另一個。

你應該改變

std::vector<T>::iterator it = ... 

std::vector<T>::const_iterator it = ... 

或者更好的讓編譯器爲你做的工作:

auto it = ... 
相關問題