当前位置:  开发笔记 > 编程语言 > 正文

C++ STL向量:从索引获取迭代器?

如何解决《C++STL向量:从索引获取迭代器?》经验,为你挑选了4个好方法。

所以,我编写了一堆代码,通过index []访问stl向量中的元素,但现在我只需要复制一个向量的块.它看起来像vector.insert(pos, first, last)我想要的功能......除了我只有第一个和最后一个作为整数.有没有什么好方法可以获得这些值的迭代器?



1> dirkgently..:

试试这个:

vector::iterator nth = v.begin() + index;


@VincentRobert:其他方式.指针是STL随机迭代器的有效实现,是最强大的类别.但是其他功能较弱的类别(如前向迭代器)不支持相同的算法.
通常,您可以对STL迭代器使用与使用指针相同的算法.它们设计为在使用STL算法时可以交换.
我想要在这个答案中加上我的五美分并推荐`std :: next(v.begin(),index)`

2> bayda..:

@dirkgently提到的方式( v.begin() + index )很好,快速的矢量

但是大多数通用方法和随机访问迭代器也可以工作. std::advance( v.begin(), index )

EDIT
使用差异:

std::vector<>::iterator it = ( v.begin() + index );

要么

std::vector<>::iterator it = v.begin();
std::advance( it, index );

在@litb笔记之后添加.


如果你*知道你正在处理`std :: vector`,那么使用`std :: advance`是没有意义的.它只会诱使你认为你正在编写与容器无关的代码(你没有这样做,考虑迭代器失效规则,不同的运行时复杂性以及诸如此类的东西).`std :: advance`有意义的唯一情况是你自己编写一个模板,它不知道它正在处理什么样的迭代器.

3> Viktor Sehr..:

也; auto it = std::next(v.begin(), index);

更新:需要符合C++ 11x标准的编译器


@Zoomulator:如果复制迭代器是一个性能问题,那么你需要处理更大的问题.
应该注意的是,这是C++ 11的方式!std :: next相当于std :: advance.使用这些函数而不是使用算术,可以更容易地交换容器类型.甚至可以在c-arrays上工作,就像std :: begin和std :: end一样.
还应该注意,std :: advance是由白痴设计的,因为它使用引用作为输出,而不是返回值.
两者都有它们的用途.stda :: advance对于更改迭代器非常有用.这是循环中的性能问题.正如你的建议,我更喜欢下一个转让的情况.我发现它有点苛刻声称它是愚蠢的.这两个功能在设计时考虑了不同的情况,即使它们基本相同.

4> TimW..:

或者你可以使用 std::advance

vector::iterator i = L.begin();
advance(i, 2);

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有