在c ++中找到最小数+ ve数?

时间:2013-10-06 13:36:34

标签: c++ stl min

我想在C ++中找到使用STL的最小数字,我知道语法应该是min(x,y)。但我想在列表中找到最小+ ve数字。没有包含-ves。我该怎么做?

P.S我的号码在数组中

4 个答案:

答案 0 :(得分:3)

要查找最小数字,使用std::min_element是有意义的。幸运的是,它附带了一个可选的比较参数,我们可以使用它:(sample here

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 >= 0,将t2 <= 0更改为t2 < 0

答案 1 :(得分: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())。

答案 2 :(得分: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,只需将lambda替换为预装的仿函数,例如less&lt;&gt;

答案 3 :(得分:0)

您可以将std::min_elementBoost::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.
    }
}