27

How can I find the minimum value from a vector?

int main()
{
    int v[100] = {5,14,2,4,6};
    int n = 5;
    int mic = v[0];
    for(int i=0;i<v[n];i++)
    {
        if(v[i]<mic)
        mic=v[i];
    }
    cout<<mic;
}

But is not working, what can I do?

4

7 に答える 7

94

std::min_element(vec.begin(), vec.end())- std::vector
std::min_element(v, v+n)の場合 - 配列の場合
std::min_element( std::begin(v), std::end(v) )- @JamesKanze のコメントから C++11 バージョンを追加

于 2012-10-22T16:48:10.847 に答える
47

いつでもstlを使用できます。

auto min_value = *std::min_element(v.begin(),v.end());
于 2012-10-22T16:58:47.877 に答える
13
#include <iostream>
#include <vector>
#include <algorithm> // std::min_element
#include <iterator>  // std::begin, std::end

int main() {
    std::vector<int> v = {5,14,2,4,6};
    auto result = std::min_element(std::begin(v), std::end(v));
    if (std::end(v)!=result)
        std::cout << *result << '\n';
}

あなたが示すプログラムにはいくつかの問題があります。主な原因はfor条件です: i<v[n]. 配列を初期化して、最初の 5 つの要素をさまざまな値に設定し、残りをゼロに設定します。n明示的に初期化した要素の数に設定されているため、v[n]暗黙的にゼロに初期化された最初の要素です。したがって、ループ条件は最初は false であり、ループはまったく実行されません。コードは単に最初の要素を出力します。

いくつかの小さな問題:

  • 生の配列は避けてください。それらは奇妙で一貫性のない動作をします (たとえば、配列の最初の要素へのポインターへの暗黙的な変換、代入できない、値によって関数に渡したり関数から返したりすることはできません)。

  • マジックナンバーは避けてください。int v[100]配列にどこかから入力を取得させてから、100 を超える要素を処理しようとする場合、バグへの招待です。

  • 実装ファイルでは大したことではありませんが、IMO は明示的な修飾に慣れる方が良いですが、ヘッダー ファイルに配置して不必要な名前の競合を引き起こし始めるためusing namespace std;、盲目的にどこでも使用すると問題が発生する可能性があります。

于 2012-10-22T16:48:44.230 に答える
10

コードにエラーがあります。この行:

for(int i=0;i<v[n];i++)

する必要があります

for(int i=0;i<n;i++)

n場所ではなく、ベクトル内の場所を検索したいためですv[n](これは何の意味もありません)。

于 2012-10-22T16:49:50.243 に答える
4
template <class ForwardIterator>
ForwardIterator min_element ( ForwardIterator first, ForwardIterator last )
{
    ForwardIterator lowest = first;
    if (first == last) return last;
    while (++first != last)
    if (*first < *lowest) 
        lowest = first;
    return lowest;
}
于 2012-10-22T17:26:33.990 に答える
1

これを試してください

 std::min_element(v.begin(),v.end())
于 2012-10-22T16:49:45.777 に答える
0
#include <iostream>
int main()
{
    int v[100] = {5,14,2,4,6};
    int n = 5;
    int mic = v[0];
    for(int i = 0; i != n; ++i)
    {
        if(v[i] < mic)
        mic = v[i];
    }
    std:cout << mic << std::endl;;
}
于 2012-10-22T17:30:26.080 に答える