17

STL検索アルゴリズム(およびmin_elementアルゴリズム)を使用して、ベクトル内の最小値の位置を見つけようとしていますが、位置を返す代わりに、値を与えるだけです。たとえば、最小値がそれである場合、位置は 8 などとして返されます。ここで何が間違っていますか?

int value = *min_element(v2.begin(), v2.end());
cout << "min value at position " << *find(v2.begin(), v2.end(), value);
4

3 に答える 3

34

min_elementすでにイテレータを提供しているため、呼び出す必要はありませんfind(さらに、作業が 2 倍になるため非効率的です)。distanceまたは-演算子を使用します。

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
于 2008-10-08T14:09:42.480 に答える
15

使用している両方のアルゴリズムは、反復子を返します。イテレータを逆参照すると、このイテレータによって「指された」オブジェクトが取得されます。これが、実行時に位置ではなく値を出力する理由です。

cout << "min value at position " << *find(v2.begin(), v2.end(), value);

イテレータはポインタと見なすことができます (厳密にはそうではありませんが、簡単にするためにそうしましょう)。したがって、反復子だけではコンテナー内の位置を示すことはできません。ベクトルを反復しているため、コンラッドが言ったように、マイナス演算子を使用できます。

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();

ただし、std::distance アルゴリズムを使用することをお勧めします。これはより柔軟で、すべての標準コンテナーで機能します。

cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end()));
于 2008-10-08T14:23:49.737 に答える
7

std::vector<>「与えられたイテレータから位置を決定するにはどうすればよいですか?」であなたが尋ねたと思うことへの短い答え。は関数std::distanceです。

ただし、おそらく意図していたのは、イテレータの値を取得することでした。これは、逆参照することで得られます。

using namespace std;
vector<int>::const_iterator it = min_element(v2.begin(), v2.end());
cout << "min value at position " << distance(v2.begin(), it) << " is " << *it;
于 2008-10-09T05:55:50.820 に答える