我想在C++中使用STL来查找最小数,我知道语法应该是min(x,y)。但我想在列表中查找最小+ve数。不包括负数。我该怎么做?我的数字在一个数组里
bis0qfac1#
为了找到最小值,使用std::min_element是有意义的。幸运的是,它带有一个可选的比较参数,我们可以使用:(sample here)
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 >= 0,将t2 <= 0改为t2 < 0。
t1
t1 > 0
t1 >= 0
t2 <= 0
t2 < 0
e0uiprwp2#
我会使用std::accumulate和一个合适的操作:
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())。
T
MAX_VALUE
std::numeric_limits<T>::max()
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<>
lzfw57am4#
您可以将std::min_element与Boost::filter_iterator一起使用比如说:
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. } }
字符串
4条答案
按热度按时间bis0qfac1#
为了找到最小值,使用
std::min_element
是有意义的。幸运的是,它带有一个可选的比较参数,我们可以使用:(sample here)字符串
你只需要注意,如果它是将一个正数
t1
与一个负数进行比较,它应该总是为真。如果没有一个元素是正数,这将给予数组中第一个数字的位置。如果0应该被视为正数的一部分,将t1 > 0
改为t1 >= 0
,将t2 <= 0
改为t2 < 0
。e0uiprwp2#
我会使用
std::accumulate
和一个合适的操作:字符串
这里
T
是元素的类型,MAX_VALUE
是该类型的最大值(例如定义为std::numeric_limits<T>::max()
)。piah890a3#
首先使用remove_if算法将所有负数移动到集合的末尾,然后在正数范围内调用min_element。
字符串
如果你没有使用C++11,只需将lambda替换为一个预封装的仿函数,如less<>
lzfw57am4#
您可以将
std::min_element
与Boost::filter_iterator
一起使用比如说:
字符串