Answers:
试试这个:
vector<Type>::iterator nth = v.begin() + index;
std::next(v.begin(), index)
@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
有意义的情况是当您自己编写模板时不知道它要处理哪种迭代器。
也; auto it = std::next(v.begin(), index);
更新:需要兼容C ++ 11x的编译器
或者你可以使用 std::advance
vector<int>::iterator i = L.begin();
advance(i, 2);
实际上,std :: vector在需要时可用作C选项卡。(据我所知,C ++标准要求用于矢量实现- 替换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]);