推进std :: vector std :: advance VS运算符+的迭代器?

veh*_*zzz 13 c++ stl

我发现自己写了很多东西:

int location =2;
vector<int> vec;
vector<int>::iterator it=vec.begin();

/..../
std::advance(it, location);
Run Code Online (Sandbox Code Playgroud)

代替

 it= it + 5;
Run Code Online (Sandbox Code Playgroud)

什么是首选/推荐方式?

Jer*_*fin 16

添加仅适用于随机访问迭代器.std :: advance将适用于各种迭代器.只要你只将迭代器处理成向量,它就没有什么区别,但是std :: advance使你的代码更加通用(例如,你可以用一个列表代替向量,那部分仍然可以工作).

编辑:对于那些谁照顾,该标准描述std::advancestd::advance如下(§24.3.4/ 1):

由于只有随机访问迭代器提供了+和 - 运算符,因此该库提供了两个函数模板listvector.这些函数模板使用advancedistance随机访问迭代器(因此,它们是恒定的时间); 用于输入,转发和双向迭代器,用于advance提供线性时间实现.

  • 另一方面,使用较少的通用代码将阻止您无意中使代码失望:毕竟,使用列表容器进行大量"随机访问"可能不是一个好主意. (12认同)

sbi*_*sbi 6

这取决于你需要什么:

如果您需要通用性,请使用std::advance(it,2).如果有人出现并将其更改std::vector为a std::list,则代码仍将编译,即使现在提前需要线性时间而不是恒定时间.

如果您需要性能,请使用it+=2.如果有人出现并将您更改std::vector为a std::list,则代码将无法编译,指向(可能带有帮助的评论)严重的性能问题.