繁体   English   中英

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

[英]Advance iterator for the std::vector std::advance VS operator +?

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

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

/..../
std::advance(it, location);

代替

 it= it + 5;

什么是首选/推荐方式?

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

对于那些关心的人,标准描述了advancedistance如下(§24.3.4/ 1):

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

另请注意,从C ++ 11开始,标准向std::next添加了一个参数,因此您可以使用它前进指定的数量(和std::prev类似)。 std::advance的不同之处在于它返回修改后的迭代器( std::advance不会),这在某些情况下很方便。

这取决于你需要什么:

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

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

这取决于迭代器。 it=it+5如果支持它会更快(它只支持随机访问迭代器)。 如果你想推进功能较弱的迭代器(例如前向迭代器或双向迭代器),那么你可以使用std::advance ,但它更慢,因为它实际上遍历所有中间元素。

std::advance适用于非随机迭代器,而+=版本适用于随机访问序列(向量等)。

std::adnvance是通用的 - 如果你不总是知道底层容器的类型,它会很有用 - 它适用于所有情况。

然而它是有效的:如果它传递一个RandomAccessIterator(如std::vector ), std::advance将进行优化,并且会在ForwardAccessIterator的循环中增加迭代器(就像在std::list )。

使用std :: advance。 它同样有效(它使用迭代器特性来为随机访问迭代器添加迭代器),并且更通用的是它也适用于其他类型的迭代器。

如果您永远不会更改容器(并且您可能不是),请使用+,因为它易于查看和理解,并使代码更简洁。

如果您认为要更改容器,或者如果您在可能在各种容器类型上实例化的模板内部工作,请使用advance,因为它适用于任何容器。

作为一般规则,我不担心更改容器类型,因为我发现当我必须更改容器类型时,我最终会重新访问容器被使用的任何地方,只是为了确保我不做任何突然愚蠢的东西(比如从列表中间随机抽取元素)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM