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

mpe*_*pen 194 c++ iterator stl vector

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

dir*_*tly 276

试试这个:

vector<Type>::iterator nth = v.begin() + index;
Run Code Online (Sandbox Code Playgroud)

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

bay*_*yda 84

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

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

EDIT
使用差异:

std::vector<>::iterator it = ( v.begin() + index );
Run Code Online (Sandbox Code Playgroud)

要么

std::vector<>::iterator it = v.begin();
std::advance( it, index );
Run Code Online (Sandbox Code Playgroud)

在@litb笔记之后添加.

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

Vik*_*ehr 45

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

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

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

Tim*_*imW 8

或者你可以使用 std::advance

vector<int>::iterator i = L.begin();
advance(i, 2);
Run Code Online (Sandbox Code Playgroud)