在C++中求最小正数

noj0wjuj  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(116)

我想在C++中使用STL来查找最小数,我知道语法应该是min(x,y)。但我想在列表中查找最小+ve数。不包括负数。我该怎么做?
我的数字在一个数组里

bis0qfac

bis0qfac1#

为了找到最小值,使用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

e0uiprwp

e0uiprwp2#

我会使用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())。

piah890a

piah890a3#

首先使用remove_if算法将所有负数移动到集合的末尾,然后在正数范围内调用min_element。

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

字符串
如果你没有使用C++11,只需将lambda替换为一个预封装的仿函数,如less<>

lzfw57am

lzfw57am4#

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

字符串

相关问题