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));
     }

しかし、元の実装でコンパイル エラーが発生する理由がわかりません。修正するために何かできることはありますか?

4

2 に答える 2

2

さまざまなタイプのイテレータを比較しようとしています。const をそのまま使用する必要がありconst_iteratorますweighting

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

autoこれが、C++11 で非常に優れている理由です。

于 2013-10-14T12:45:29.650 に答える
1

Vector には 2 種類の反復子const_iteratorと regularがありますiterator。これらは異なる型であるため、一方から他方に変換することはできません。

あなたは変わるべきです

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

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

または、コンパイラに作業を任せてください。

  auto  it = ...
于 2013-10-14T12:46:47.943 に答える