web-dev-qa-db-ja.com

vector <double>でstd :: max_elementを使用する

std::min_elementstd::max_elementを使用して、倍数のベクトルで最小要素と最大要素を返そうとしています。私のコンパイラは、現在それらをどのように使用しようとしているのか気に入らず、エラーメッセージを理解していません。もちろん、最小値/最大値を見つけるために独自の手順を書くこともできますが、関数の使用方法を理解したいと思います。

#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char** argv) {

    double cLower, cUpper;
    vector<double> C;

    // code to insert values in C not shown here

    cLower = min_element(C.begin(), C.end());
    cUpper = max_element(C.begin(), C.end());

    return 0;
}

コンパイラエラーは次のとおりです。

../MIXD.cpp:84: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment
../MIXD.cpp:85: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment

誰かが私が間違っていることを説明してもらえますか?

72
synaptik

min_elementおよびmax_elementは、値ではなく反復子を返します。したがって、*min_element...*max_element...が必要です。

105
David Schwartz

他の人が言ったように、 std::max_element()std::min_element() return iterators 、これを取得するにはdereferencedである必要がありますvalue

(値だけでなく)イテレータを返すことの利点は、コンテナ内の(最初の)要素のpositionを最大(または最小)で決定できることです。値。

例(簡潔にするためにC++ 11を使用):

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};

    auto biggest = std::max_element(std::begin(v), std::end(v));
    std::cout << "Max element is " << *biggest
        << " at position " << std::distance(std::begin(v), biggest) << std::endl;

    auto smallest = std::min_element(std::begin(v), std::end(v));
    std::cout << "min element is " << *smallest
        << " at position " << std::distance(std::begin(v), smallest) << std::endl;
}

これにより以下が得られます。

Max element is 5 at position 4
min element is 1 at position 0

注意:

std::minmax_element() を使用すると、上記のコメントで示唆されているように、大規模なデータセットの場合は高速になりますが、結果が若干異なる場合があります。上記の例のvaluesは同じですが、「max」要素の位置は9になります。

複数の要素が最大要素に相当する場合、そのような要素の最後の反復子が返されます。

55
Johnsyweb

min/max_elementは、min/max要素の値ではなく、min/max要素にiteratorを返します。値を取得してdoubleに割り当てるには、イテレータを逆参照する必要があります。あれは:

cLower = *min_element(C.begin(), C.end());
26
Cornstalks