range-based for
loop
for (range_declaration : range_expression)
loop_statement
大致等于以下代码:
for (auto begin = range_expression.begin(),end = range_expression.end();
begin != end; ++begin)
{
range_declaration = *begin;
loop_statement
}
请注意*
运算符。因此,range_declaration
不是迭代器,而是它指向的元素。
如果需要索引,请使用普通的for
循环:
for (std::size_t index = 0; index < my_vector.size(); ++index)
loop_statement
,
C ++将向量迭代器转换为索引
您可以这样做:
std::size_t index = std::distance(std::begin(my_vector),iterator);
但是在您可以从迭代器获取索引之前,首先需要拥有一个迭代器。向量迭代器的示例:
// iterator to i'th element
auto iterator = std::next(my_vector.begin(),i);
for (auto iterator : my_vector)
仅命名变量迭代器并不会使它成为迭代器。基于范围的循环遍历容器的 elements 。此向量的元素是元组,而不是迭代器。
迭代向量元素时具有索引的规范方法是使用传统的索引循环:
using my_vec_t = decltype(my_vector);
for (my_vec_t::size_type i = 0; i < my_vector.size(); i++)
如果您确实希望将索引放在range-for循环中,则可以使用指针:
auto* front = &my_vector.front();
for (auto& element : my_vector)
{
auto index = std::distance(front,&element);
}
,
在基于范围的循环中,为容器的值分配的不是迭代器。
因此请使用以下for循环
#include <iterator>
//...
for ( auto it = std::begin( my_vector); it != std::end( my_vector ); ++it )
{
size_t index = std::distance( std::behin( my_vector ),it );
}
或者使用带索引的普通for循环。
for ( std::vector<std::tuple<int,int>>::size_type i = 0; i != my_vector.size(); i++ )
{
auto it = std::next( std::begin( myvector ),i );
}
本文链接:https://www.f2er.com/3137472.html