雖然有一個明確的for回圈解決方案,但我正在尋找一個解決方案,以獲得一個給定范圍內的向量中的最大值。
例如,假設一個向量有3,5,7,9,5,1,6,7,4,2,給定的范圍是[4,8],那么最大元素應該是7。
我正在尋找一個單行的/簡短的解決方案,使用一些內置的std庫函式來解決這個問題。
該陣列包含所有的正數。
這就是我的想法。
這就是我所嘗試的 :
int max = -1;
for (i = 0; i < n; i )
if (arr[i] > max && arr[i] >= low && arr[i] < = high)
max = arr[i]。
我只是在尋找一個簡單的標準庫矢量解決方案。
uj5u.com熱心網友回復:
并不總是在一行中擠壓太多東西,或者總是使用演算法,特別是在回圈清晰可讀的情況下,這樣做是值得的。總之,如果你喜歡,你可以使用std::accumulate。二進制操作與你的原始代碼相當接近,我只是使用了條件運算子,而不是if:
auto x = std::accumulate(arr.begin(),arr. end(),-1,[high,low](int accu,int elem){
return (elem > accu && elem >= low && elem <= high ) ? elem : accu;
});
uj5u.com熱心網友回復:
類似于@Yksisarvinen的回答,但使用std::tuple的<來縮短它。
這有一個前提條件,即在輸入中至少有一個在范圍內的元素。
這有一個前提條件。
#include <cassert>
#include <algorithm>
#include <tuple>
#include <vector>
int main() {
std:: vector<int> arr {3,5,7,9, 5, 1,6,7,4, 2}。
int lowerLimit = 4;
int upperLimit = 8;
auto inRange = [lowerLimit, upperLimit](int value)
{
return value >= lowerLimit & & value <= upperLimit;
};
auto compare = [inRange](int lhs, int rhs) {
return std::tuple(inRange(lhs), lhs) < std: :tuple(inRange(rhs), rhs)。
};
assert(!arr.empty())。
assert(std::any_of(arr.begin(), arr.end(), inRange)) 。
auto it = std::max_element(arr.begin(), arr.end(), compare)。
int max = *it;
}
uj5u.com熱心網友回復:
這遠遠不是一條線(除非你認為輔助函式不是代碼的一部分,那么它肯定是一條線),但如果你真的想使用標準演算法,你需要一個比較函式,它將符合嚴格的弱排序。
bool inRange(int value, int lowerLimit, int upperLimit)
{
return value >= lowerLimit & & value <= upperLimit;
}
std:: vector<int> arr {3,5,7,9, 5, 1,6,7,4, 2}。
int lowerLimit = 4;
int upperLimit = 8;
auto compare = [lowerLimit, upperLimit](int l, int r){
if(inRange(l, lowerLimit, upperLimit) && inRange(r, lowerLimit, upperLimit) ) {
//兩個值都在范圍內,所以比較它們。
return l < r;
} else if (inRange(r, lowerLimit, upperLimit)) {
//r是在范圍內,l不是,l應該比較小。
return true。
} else if (inRange(l, lowerLimit, upperLimit) ) {
// l是在范圍內,r不是,r應該比較小。
return false。
} else {
//兩者都不在范圍內,正常比較以保持嚴格的弱排序要求。
return l < r;
}
};
auto maxIter = std::max_element(std::begin(arr), std::end(arr), compare)。
std::cout << "最大值是" << *maxIter。
uj5u.com熱心網友回復:
雖然其他人已經展示了使用標準演算法的可行解決方案,我想建議一個類似于std::max_element的實作。在這里,當你向演算法函式提供一個非有效的范圍時,你將獲得更多的靈活性,該怎么做。
#include <iterator>std::iterator_traits
template<typename Iterator>
using EleType = typename std::iterator_traits<Iterator> :value_type。
template< class Iterator>
auto my_max_element(Iterator first, const Iterator last,
EleType<Iterator> minValue, EleType<Iterator> maxValue)
{
Iterator largest = first;
for (; first != last; first)
if (minValue <= *first && *first <= maxValue & & *largest < *first)
最大=第一。
//最大元素的最后范圍檢查。
return (minValue <= *largest && *largest <= maxValue) ? largest : last。
}
uj5u.com熱心網友回復:
這里有一個利用兩個標準lib函式std::sort和std::find_first_of:
#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
//尋找val_range范圍內的樣本向量的最大元素。
使用 namespace std;
int main()
{
vector<int> sample = { 3,5,7,9, 5, 1,6,7,4,2 };
vector<int> val_range = { 4,8 };
//按相反順序排序。
sort(sample.begin(), sample. end(), greater<int>()。
vector<int>:iterator it = find_first_of(sample.begin(), sample.end(), val_range. begin(), val_range. end(), [](int value, int max_val) {return value <= max_val;} ) 。
cout << (*it) << endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/306752.html
標籤:
下一篇:使用 1按鈕的奇怪行為
