作者:凹凸曼00威威_694 | 2023-08-29 08:18
所以,我编写了一堆代码,通过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);