繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM