C++ 求向量中的最小数

C++ 求向量中的最小数,c++,sorting,vector,C++,Sorting,Vector,给定一个包含5000+个元素的向量距离,确定最小非零值的最快方法是什么?目前,我有一些天真的想法: double distance=1E10; //I know that my distances are always less than this for (unsigned int i=0; i< a.size(); i++){ if (a.at(i) < distance && a.at(i) != 0){ distance=a.at(i); }

给定一个包含5000+个元素的向量距离,确定最小非零值的最快方法是什么?目前,我有一些天真的想法:

double distance=1E10; //I know that my distances are always less than this
for (unsigned int i=0; i< a.size(); i++){
  if (a.at(i) < distance && a.at(i) != 0){
    distance=a.at(i);
  }
} 
我考虑过先对向量排序,然后取第一个非零值,但我希望有人能提供更快的优化方法

auto min = std::numeric_limits<double>::max();
for(auto& v : a) {
    if(v < min && v != 0) {
        min = v;
    }
}

非常直截了当。如果您可以保持集合的排序,那么您可以做得更好。您当前多次使用.at,它执行边界检查。

一些简单且速度稍快的方法

double best=1E10; //I know that my distances are always less than this
for (unsigned int i=0; i< a.size(); i++){
  if (a[i] < best && a[i] != 0){
    best=a[i];
  }
}

double best=1E10; //I know that my distances are always less than this
for (auto it = a.begin(); it!= a.end(); ++it){
  if (*it < best && *it != 0){
    best=*it;
  }
}

为什么要在向量中线性搜索?这是最坏的情况。只需对向量排序,然后找到最小值。很简单,不是吗? 检查代码:

假设

vector <int> v; // it contains values 5,4,1,2,3
sort(v.begin(),v.end()); //STL sort function
那么v[0]是最小的值=1

您可以尝试使用std::sort和std::upper


此功能的标准功能:

auto min = *std::min_element(begin(distances), end(distances),
    [](double a, double b) { return b==0 || a<b; } );

.at不好,is内置了边界检查,所以这将是最慢的方法之一。@RichardPlunkett:啊,我从没想过。说得好!有什么建议吗?先排序?向量排序了吗?如果是,请使用下限。如果没有,使用min_元素进行迭代。使用[i],或者更好一些,使用迭代器或内置循环。不,向量没有分类。第一个版本有点令人失望,但这更好:@RichardPlunkett:Heh,是的,吃东西,抱着婴儿,用一只手打字。。。愚蠢的错误。可怕,在日志N和非常量上。此外,无法跳过零值。
auto min = *std::min_element(begin(distances), end(distances),
    [](double a, double b) { return b==0 || a<b; } );