给定一个未排序的向量和一个相同类型的输入元素,找到向量中小于给定元素的最大元素的最有效方法是什么?这就是我到目前为止所做的:
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
由于
答案 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;
}