【问题标题】:Index of minimum element in a std::liststd::list 中最小元素的索引
【发布时间】:2012-03-30 02:03:09
【问题描述】:

如果我有一个std::vector<int>,我可以通过两个迭代器相减得到最小元素的索引:

int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin();

但是,对于没有随机访问迭代器的容器,例如 std::list<int>,这是行不通的。当然,可以做类似的事情

int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end()));

但是我必须遍历列表两次。

我是否可以通过 STL 算法仅通过列表迭代一次来获得具有最小值的元素的索引,还是我必须编写自己的 for 循环?

【问题讨论】:

  • 为什么需要std::list中的元素索引?
  • 您可以编写一个迭代器来包装list::iterator 并随时跟踪其索引。它的用途有限,因为从容器中插入/删除元素会使存储在迭代器中的索引无效,但您可以在其上使用min_element 和其他算法,然后从返回值中获取索引。
  • 您可以使用std::set 或对您的容器进行排序,并且始终知道最小元素在哪里...
  • 如果您想这样做,list 可能是该作业的错误数据结构。
  • @Niklas B. :也许他有他的理由......即这是他必须处理的容器。

标签: c++ stl iterator std listiterator


【解决方案1】:

您必须编写自己的函数,例如:

template <class ForwardIterator>
  std::size_t min_element_index ( ForwardIterator first, ForwardIterator last )
{
  ForwardIterator lowest = first;
  std::size_t index = 0;
  std::size_t i = 0;
  if (first==last) return index;
  while (++first!=last) {
    ++i;
    if (*first<*lowest) {
      lowest=first;
      index = i;
    }
  }
  return index;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2012-11-13
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多