如何使迭代器指向与C ++集中的另一个元素相同的元素?

时间:2013-08-02 08:38:42

标签: c++ iterator set

同一类型的集合有2个迭代器:

    typename TFunction <T>::Type ::const_iterator i1 = f1.begin();
    typename TFunction <T>::Type ::const_iterator i2 = f2.begin();

在几个步骤之后,i1指向具有index = index1的f1的某个元素(可能不知道)。我需要将第二个迭代器i2设置为具有与index1相同索引的f2元素...

这可以在没有将i1转换为索引的情况下完成吗?

3 个答案:

答案 0 :(得分:5)

std::advance用作:

std::advance(it2, index1); //increments it2 index1 times!

完成!

如果你不知道index1的价值,那么你总是可以使用当前 it1来计算它:

auto index1 = std::distance(f1.begin(), it1);

: - )


请注意,std::advance会返回void,因此您无法写下此内容:

fun(f2.begin(), std::advance(it2, index1)); //error

相反,如果你必须写这个:

std::advance(it2, index1); //first advance
fun(f2.begin(), it2);        //then use it

为了简化这种用法,在C ++ 11中添加了std::next

fun(f2.begin(), std::next(f2.begin(), index1)); //ok, don't even need it2!

BTW,在C ++ 11中,您可以使用auto而不是typename thingy:

auto it1 = f1.cbegin(); //cbegin() returns const_iterator
auto it2 = f2.cbegin(); //cbegin() returns const_iterator

希望有所帮助。

答案 1 :(得分:1)

我不清楚您的索引是什么,但如果您已移动i1,则可以使用std::distance查看费用,然后使用std::advance

std::advance(i2, std::distance(f1.begin(), i1));

答案 2 :(得分:0)

使用std::advance(i2,index1)推进i2