向量中的最小值,跳过一些索引

时间:2015-02-26 22:15:57

标签: algorithm c++11 minimum

我有一个双精度矢量,需要知道矢量中最小值的索引和值。这很容易用算法标题完成,但是我需要忽略一些索引。

由于我需要原始索引,因此删除索引无效。另一个选择是为所有必须跳过的值添加一个常量,这样它们肯定不是最小值。然而,这似乎效率很低。

目前我有以下功能,我仍然需要跳过except中给出的索引。我尝试找到d_distance最小

pair<size_t, double> City::closest(vector<size_t> const &except) const
{ 
  auto min_el = min_element(d_distance.begin(), d_distance.end());
  size_t idx = distance(d_distance.begin(), min_el) + 1;

  return make_pair(idx, *min_el);
}

请注意,我的问题与this question不同,因为他想跳过某些值而不是索引。

1 个答案:

答案 0 :(得分:1)

您可以显式迭代向量并忽略索引。以下是如何做到的:

std::pair<size_t, double> closest(
   std::vector<double> const & distance, 
   std::vector<size_t> const & except)
{
   auto min = std::numeric_limits<double>::max();
   auto pos = static_cast<size_t>(-1);

   auto pos_except = size_t{0};
   for(size_t i = 0; i < distance.size(); ++i)
   {
      if(pos_except < except.size() && i == except[pos_except])
         pos_except++;
      else
      {
         if(distance[i] < min)
         {
            min = distance[i];
            pos = i;
         }
      }
   }

   return std::make_pair(pos, min);
}

int main()
{
   auto distance = std::vector<double> {10.0, 2.5, 0.5, 4.5, 8.0, 17.2, 10.1};
   auto except = std::vector<size_t> {0, 2, 5};

   auto result = closest(distance, except);

   return 0;
}