[英]C++ turn vector iterator into index
我有个问题。 我有一个包含元组的向量:
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
中使用迭代器。 也许有人可以给我一些建议。
基于范围的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
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++)
如果您真的想在 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::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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.