C ++将向量迭代器转换为索引

我有一个问题。 我有一个包含元组的向量:

vector<tuple<int,int> > my_vector

假设我出于某种原因想在索引中打开for循环迭代器:

// Example program
#include <vector>
#include <tuple>

using namespace std;

int main()
{        
    vector<tuple<int,int> > my_vector;
    my_vector.push_back(make_tuple(1,1));
    my_vector.push_back(make_tuple(2,2));
    my_vector.push_back(make_tuple(3,3));

    for (auto iterator : my_vector)
    {
        size_t index = distance(my_vector.begin(),iterator);
    }       
}

老实说,我不明白要使其运行必须进行哪些更改。问题似乎是我在distance中使用了迭代器。也许有人可以给我一些建议。

gongshaobo 回答:C ++将向量迭代器转换为索引

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

大家都在问