Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::列表中最小元素的索引_C++_Stl_Iterator_Std_Listiterator - Fatal编程技术网

C++ std::列表中最小元素的索引

C++ std::列表中最小元素的索引,c++,stl,iterator,std,listiterator,C++,Stl,Iterator,Std,Listiterator,如果我有一个std::vector,我可以通过减去两个迭代器来获得最小元素的索引: int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin(); 但是,对于没有随机访问迭代器的容器,例如std::list,这不起作用。当然,有可能像这样做 int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end())); 但是我必须

如果我有一个
std::vector
,我可以通过减去两个迭代器来获得最小元素的索引:

int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin();
但是,对于没有随机访问迭代器的容器,例如
std::list
,这不起作用。当然,有可能像这样做

int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end()));
但是我必须在列表中重复两次


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

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

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;
}
模板
std::size\u t min\u元素索引(ForwardIterator first,ForwardIterator last)
{
ForwardIterator最低=第一;
标准:尺寸指数=0;
标准:尺寸i=0;
如果(第一个==最后一个)返回索引;
而(++第一个!=最后一个){
++一,;

如果(*首先为什么需要
std::list
中元素的索引?您可以编写一个迭代器来包装
list::iterator
,并在运行时跟踪其索引。它的用途有限,因为从容器中插入/删除元素会使迭代器中存储的索引无效,但您可以使用
minu ele然后从返回值中提取索引。您可以使用
std::set
或对容器进行排序,并始终知道最小元素的位置……如果您想这样做,列表可能是该作业的错误数据结构。@Niklas B:可能他有他的原因……即,这就是包含呃,他得努力。