我想在 C++ 中使用 STL 找到最小数字,我知道语法应该是 min(x,y)。但我想在列表中找到最小的 +ve 数字。不包括-ves。我怎么做?
PS我的数字在一个数组中
为了找到最小数量,使用std::min_element
. 幸运的是,它带有一个可选的比较参数,我们可以使用它:(示例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
我会使用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()
)。
首先使用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 替换为来自 like less<> 的预装仿函数
你可以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.
}
}