比给定值最小的最大元素的 STL 算法

Posted

技术标签:

【中文标题】比给定值最小的最大元素的 STL 算法【英文标题】:STL algorithm for smallest max element than a given value 【发布时间】:2016-10-08 23:08:19 【问题描述】:

最近我遇到了这个代码片段:

// look for element which is the smallest max element from
// a given iterator
int diff = std::numeric_limits<int>::max();
auto it = nums.rbegin();
auto the_one = nums.rbegin();

for (; it != given; ++it) // this terminates

  int local_diff = *it - *given;
  // if the element is less than/equal to given we are not interested
  if (local_diff <= 0)
     continue;

  if (local_diff < diff)
  
     // this update the global diff
     diff = local_diff;
     the_one = it;
  

我想知道是否有人能想到一个优雅的 stl 算法来代替上述算法。本质上,我们必须遍历所有元素,并跟踪我们需要的元素。这与std::max_element 不同(至少我不能那样建模)。

【问题讨论】:

什么是“最小最大元素”? 啊。我应该说最小的最大元素。 auto filtered=nums|filtered([&amp;](int v)return v&lt;*given;); auto the_one=std::max_element(filtered.begin(),filtered.end()); 【参考方案1】:
auto the_one = std::min_element(nums.rbegin(), given,
  [given](int a, int b) 
    bool good_a = a > *given;
    bool good_b = b > *given;
    return (good_a && good_b) ? a < b : good_a;
  );

诀窍是编写一个比较函数,声明任何“好”元素(大于*given 的元素)来比较小于任何“不好”元素。正常比较两个“好”元素;两个“坏”元素总是被声明为等价的。

【讨论】:

以上是关于比给定值最小的最大元素的 STL 算法的主要内容,如果未能解决你的问题,请参考以下文章

使用 STL 算法在表(向量的向量、二维数组)中查找最小值/最大值的优雅方法

算法学习——贪心算法之删数字(求最小值)

基础算法 分治法求最大最小元

算法拾遗最大数和最小数

java数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)

java数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)