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:可能他有他的原因……即,这就是包含呃,他得努力。