【问题标题】:ArgMin for vector<double> in C++?C ++中vector <double>的ArgMin?
【发布时间】:2012-05-19 18:32:49
【问题描述】:

我想找到 C++ std::vector&lt;double&gt; 中最小值的索引。这是一个有点冗长的实现:

//find index of smallest value in the vector
int argMin(std::vector<double> vec)
{
    std::vector<double>::iterator mins = std::min_element(vec.begin(), vec.end()); //returns all mins
    double min = mins[0]; //select the zeroth min if multiple mins exist
    for(int i=0; i < vec.size(); i++)
    {
        //Note: could use fabs( (min - vec[i]) < 0.01) if worried about floating-point precision
        if(vec[i] == min)    
            return i;
    }
    return -1;
}

(如果您发现上述实现中有任何错误,请告诉我。我测试了它,但我的测试并不详尽。)

我认为上面的实现可能是一个轮子改造;如果可能的话,我想使用内置代码。为此,是否有对 STL 函数的单行调用?或者,有人可以建议更简洁的实现吗?

【问题讨论】:

  • std::min_element 不会“返回所有分钟”。它返回一个迭代器,指向范围内的最小元素。如果最小值出现多次,则迭代器指向第一个。你的mins[0] 应该是*mins,因为它是一个迭代器,而不是一个结果数组。

标签: c++ collections stl vector


【解决方案1】:

您可以使用标准的min_element 函数:

std::min_element( vec.begin(), vec.end() );

它返回一个迭代器,指向迭代器范围内的最小元素。由于您需要一个索引并且您正在使用vectors,因此您可以从vec.begin() 中减去生成的迭代器以获得这样的索引。

如果您需要自定义比较,函数或函数对象还有一个额外的重载。

【讨论】:

  • ...然后减去迭代器以找出索引。
  • std::min_element(v.begin(), v.end()) - v.begin()
  • @larsmans:多么粗糙。老练的人说std::distance(v.begin(), std::min_element(v.begin(), v.end())) :-)
  • 如果您使用 std::distance,即使 v.begin() 不是随机访问并且必须一次增加一步才能得到答案,它也会起作用。这可能是你想要的。但是您可能更喜欢使用简单的运算符 - 这样如果您遇到性能错误,它将无法编译。
  • 它位于&lt;algorithm&gt; - 以防万一有人想知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多