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中使用了迭代器。也许有人能给我一些建议。

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)

仅仅命名变量迭代器并不能使其成为迭代器。基于范围的循环遍历容器的元素。这个向量的元素是元组,而不是迭代器。

迭代向量的元素时,获得索引的规范方法是使用传统的索引循环:

using my_vec_t = decltype(my_vector);
for (my_vec_t::size_type i = 0; i < my_vector.size(); i++)

如果你真的想让索引在循环的范围内,可以使用指针:

auto* front = &my_vector.front();
for (auto& element : my_vector)
{
auto index = std::distance(front, &element);
}  

基于范围的for循环

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

在基于范围的循环中,它是容器的值,而不是迭代器。

因此,对环路使用以下方法

#include <iterator>
//...
for (auto it = std::begin(my_vector); it != std::end(my_vector); ++it)
{
size_t index = std::distance(std::begin(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);
}

最新更新