C++-返回向量中最大元素的最有效方法小于给定的输入

C++ - Most efficient way to return largest element in vector less than given input

本文关键字:小于 方法 输入 有效 元素 返回 向量 C++-      更新时间:2023-10-16

给定一个未排序的向量和一个相同类型的输入元素,在向量中找到小于给定元素的最大元素的最有效方法是什么?这就是我目前所拥有的:

std::vector<double> vec{1,2.2,3.5,4};
double elem = 3;
double lessThan(double elem, std::vector<double> vec) 
{
    std::vector<double> tmp = vec;
    tmp.push_back(elem);
    sort(tmp.begin(), tmp.end());
    return *(find(tmp.begin(), tmp.end(), elem) - 1);
}
lessThan(elem, vec); //returns 2.2

感谢

首先,不要按值传递向量,因为复制向量会导致值传递并写入内存,这既昂贵又不必要。

接下来,不要sort()元素:这只是昂贵和不必要的。只需进行线性搜索,记住迄今为止找到的最大合适值。您可以使用max_element(),并将大于截止值的元素视为相等类。

我可以写代码,但我不想破坏你解决家庭作业的娱乐。

最有效的方法是编写自己的函数。:)例如

#include <iostream>
#include <vector>
std::vector<double>::const_iterator lessThan( const std::vector<double> &v, 
                                              double value ) 
{
    auto first = v.begin();
    while ( first != v.end() && !( *first < value ) ) ++first;
    auto max = first;
    for ( ; first != v.end(); ++first )
    {
        if ( *first < value && *max < *first ) max = first;
    }
    return max;
}
int main() 
{
    std::vector<double> v = { 1, 2.2, 3.5, 4 };
    double value = 3.0;
    auto max = lessThan( v, value );
    if ( max != v.cend() )
    {
        std::cout << "The maximum value less than " << value
                  << " is " << *max << std::endl;
    }
    return 0;
}

程序输出为

The maximum value less than 3 is 2.2

感谢@Dietmar Kühl的建议。我为家庭作业制作了这个版本:

#include<vector>
#include<iostream>
#include <algorithm> 
int main ()
{
   std::vector<double> vec{2.7,1,2.2,3.5,4,2.8,3.0};
   double elem = 3;
   auto it = std::max_element(vec.begin(),vec.end(),
   [elem](const double &x,const double &y)
   {
    if(y<elem & x<y) return true;
    else return false;
   });
   std::cout<<*it<<std::endl;
   return 0;
}