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

时间:2015-03-29 19:58:29

标签: c++ vector stl

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

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

由于

3 个答案:

答案 0 :(得分:6)

首先,不要通过值传递向量,因为复制向量会导致值传递并写入内存,这只是昂贵且不必要的。

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

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

答案 1 :(得分:0)

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

#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

答案 2 :(得分:0)

感谢@DietmarKü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;
}