編寫一個函數可以給出最大值以及向量數組中的相應索引,這是不難的,如下面的代碼所示:一個用於獲得最大值的模板函數及其在矢量中的相應索引
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));
}
但我不明白爲什麼我的原始實現有編譯錯誤,我可以做些什麼來糾正它?
爲什麼你會不會讓這個普通的在一定範圍內(一對迭代器)而不是一個更有限的向量? –
@ DavidRodríguez - dribeas我不明白你指的是什麼,你能舉個例子嗎? – feelfree
你正試圖寫一個幫手來避免寫什麼,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'的價值... –