2013-10-06 2 views
4

Я хочу найти минимальное число, используя STL в C++, я знаю, что синтаксис должен быть min (x, y). Но я хочу найти минимальные + ve числа в списке. Не включать в себя. Как мне это сделать?Найти минимальное число + ve число в C++?

PS Мои номера в массиве

+0

Http: //en.cppreference.com/w/cpp/algorithm ... –

+3

Что ответ, если все элементы отрицательны ? –

+0

в моей проблеме нет шансов на то, что происходит :) Но в этом случае у меня нет подсказки. – LoveMeow

ответ

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 Я искал этот ответ: D – P0W

+2

Или просто '[] (T t1, T t2) {return as_unsigned (t1) MSalters

+0

@MSalters, хорошая точка. – chris

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()).

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 просто заменить лямбда с предварительно консервированным функтором из как менее <>

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. 
    } 
} 
Смежные вопросы