4

C++ で STL を使用して最小数を見つけたいのですが、構文が min(x,y) であることはわかっています。しかし、リストで最小の+ve番号を見つけたいです。-ves は含まれません。それ、どうやったら出来るの?

PS私の番号は配列になっています

4

4 に答える 4

3

最小数を見つけるには、 を使用するのが理にかなっていますstd::min_element。幸いなことに、オプションの比較パラメーターが付属しており、これを利用できます: (サンプルはこちら)

auto pos = std::min_element(std::begin(arr), std::end(arr),
    [](const T &t1, const T &t2) {return t1 > 0 && (t2 <= 0 || t1 < t2);}
);

t1正の数と負の数を比較している場合は、常に真である必要があることを考慮に入れるように注意する必要があります。どの要素も正でない場合、配列内の最初の数値の位置が得られます。0 を陽性の一部として扱う必要がある場合は、およびに変更t1 > 0します。t1 >= 0t2 <= 0t2 < 0

于 2013-10-06T14:01:12.777 に答える
1

私はstd::accumulate適切な操作で使用します:

auto minpos = std::accumulate(myrange.begin(), myrange.end(), MAX_VALUE,
                              [](T acc, T x)
                              { return (x > 0 && x < acc) ? x : acc; });

ここTに要素の型があり、MAX_VALUEその型の最大値です (たとえば、 として定義されています std::numeric_limits<T>::max())。

于 2013-10-06T13:42:31.990 に答える
0

std::min_elementで使用できますBoost::filter_iterator

何かのようなもの:

struct is_positive_number {
  bool operator()(int x) const { return 0 < x; }
};

void foo(const std::vector<int>& numbers)
{
    typedef boost::filter_iterator<is_positive_number, base_iterator> FilterIter;

    is_positive_number predicate;
    FilterIter filter_iter_begin(predicate, begin(numbers), end(numbers + N));
    FilterIter filter_iter_end(predicate, end(numbers + N), end(numbers + N));

    FilterIter it = std::min_element(filter_iter_begin, filter_iter_end);

    if (it != filter_iter_end) {
        // *it is the min elem
    } else {
        // no positive numbers.
    }
}
于 2013-10-06T14:07:36.620 に答える
0

最初に remove_if アルゴリズムを使用してすべての負の数をコレクションの最後に移動し、次に正の範囲で min_element を呼び出します。C++11 の場合

auto pos = remove_if(coll.begin(), coll.end(), [](int x){ return x < 0; });
auto min = *min_element(coll.begin(), pos);

C++11 を使用していない場合は、ラムダを less<> などの事前に用意されたファンクターに置き換えるだけです

于 2013-10-06T14:00:57.003 に答える