2013-10-06 76 views
4

我想在C++中找到使用STL的最小數量,我知道語法應該是min(x,y)。但是我想在列表中找到最少的+ ve數字。不包括-ves。我怎麼做?在C++中找到最小數+ ve數?

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 >= 0t2 <= 0t2 < 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_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. 
    } 
}