次のコードが示すように、最大値とそれに対応するベクトル配列内のインデックスを提供できる関数を作成することは難しくありません。
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));
}
しかし、元の実装でコンパイル エラーが発生する理由がわかりません。修正するために何かできることはありますか?