【问题标题】:Minimum in vector, skipping some indices向量中的最小值,跳过一些索引
【发布时间】:2015-04-29 12:01:04
【问题描述】:

我有一个双精度向量,需要知道向量中最小值的索引和值。使用算法头很容易做到这一点,但是我需要忽略一些索引。

仅删除索引不起作用,因为我需要原始索引。另一种选择是为所有必须跳过的值添加一个常数,以确保它们不是最小值。然而,这似乎非常低效。

目前我有以下功能,我仍然需要跳过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 不同,因为他想跳过某些值而不是索引。

【问题讨论】:

  • 看起来有点像你正在尝试制作一个穷人的图形算法。不要与之抗争:图表很好。顶点着色是您似乎在此处模仿的机制。

标签: algorithm c++11 minimum


【解决方案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;
}

【讨论】:

  • 而不是省略 except 必须按升序排序的文档,您可以使用 std::set&lt;size_t&gt; 代替并完成...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多