所以,我写了一堆代码,通过 index[] 访问 stl 向量中的元素,但现在我只需要复制向量的一部分。看起来 vector.insert(pos, first, last)
是我想要的函数......除了我只有第一个和最后一个整数。有什么好方法可以获取这些值的迭代器吗?
尝试这个:
vector<Type>::iterator nth = v.begin() + index;
@dirkgently ( v.begin() + index )
提到的方式对向量来说既好又快
但 std::advance
( v.begin(), index )
最通用的方式和随机访问迭代器的工作时间也是恒定的。
编辑用法上的差异:
std::vector<>::iterator it = ( v.begin() + index );
或者
std::vector<>::iterator it = v.begin();
std::advance( it, index );
在@litb 注释之后添加。
std::vector
,那么使用 std::advance
是没有意义的。它只会诱使您认为您正在编写与容器无关的代码(您不会,考虑到迭代器无效规则、不同的运行时复杂性等等)。 std::advance
有意义的唯一情况是您自己编写一个不知道它正在处理哪种迭代器的模板。
还; auto it = std::next(v.begin(), index);
更新:需要符合 C++11x 的编译器
您始终可以使用 std::advance
在恒定时间内将迭代器移动一定数量的位置:
std::vector<int>::iterator it = myvector.begin();
std::advance(it, 2);
实际上 std::vector 是为了在需要时用作 C 选项卡。 (据我所知,C++ 标准要求向量实现 - replacement for array in Wikipedia)例如,按照我的说法,这样做是完全合法的:
int main()
{
void foo(const char *);
sdt::vector<char> vec;
vec.push_back('h');
vec.push_back('e');
vec.push_back('l');
vec.push_back('l');
vec.push_back('o');
vec.push_back('/0');
foo(&vec[0]);
}
当然,要么 foo 不能复制作为参数传递的地址并将其存储在某个地方,要么你应该确保在你的程序中永远不要在 vec 中推送任何新项目,或者请求更改其容量。或风险分段错误...
因此,在您的示例中,它导致
vector.insert(pos, &vec[first_index], &vec[last_index]);
std::next(v.begin(), index)