矢量迭代器<或!=

The*_*yer 30 c++ iterator vector

谁能帮助我了解是否有一个很大的区别!=,并<当谈到谈论内矢量迭代for循环?

我的意思是,无论你使用!=<,结果应该是一样的吗?

for (vector<int>::iterator i = vec.begin(); i != vec.end(); i++)
    // DO STUFF
Run Code Online (Sandbox Code Playgroud)
for (vector<int>::iterator i = vec.begin(); i < vec.end(); i++)
    // DO STUFF
Run Code Online (Sandbox Code Playgroud)

我知道最常用的方法是使用!=,但<如果使用会是一个大问题吗?

Max*_*kin 42

operator<仅支持随机访问迭代器.std::vector::iterator是随机访问迭代器,所以无论i != vec.end()i < vec.end()支持,有效,并在你的例子没有区别.

如果你有一个不支持随机访问迭代器的容器(例如std::list),i < list.end()就不会编译.

一般建议仅在必要时才使用后缀增量,因为当迭代器不重要时它可能会创建一个不必要的副本,因此++i更清晰,可能更快.

此外,如果循环调用其定义在此转换单元中不可用的函数vec.end()将在每次循环迭代时从内存重新加载,这可能导致不必要的高速缓存未命中.您可以通过将值保存到局部变量来避免重新加载,以便编译器确定本地变量对于任何其他函数是不可访问的:

for(vector<int>::iterator i = vec.begin(), j = vec.end(); i < j; ++i)
    // ...
Run Code Online (Sandbox Code Playgroud)

更好的是,您可能希望使用range-for循环来避免这些性能陷阱:

for(auto const& elem : vec)
    // ...
Run Code Online (Sandbox Code Playgroud)

  • @ sudorm-rfslash https://godbolt.org/g/VyQMkH - 在`慢速'它从内存重新加载`end()`,在`fast`中它将它保存在寄存器中. (6认同)

Gal*_*lik 10

STL标准库(容器,迭代器和算法)部分背后的整个哲学是最小化容器之间的程序区别.它们具有不同的属性,但是如何对它们进行编程的设计尽可能相似.

这使得它们更容易学习并且更容易一般地使用.这意味着您可以编写一个通用函数(或算法)并将其应用于任何其他容器(或尽可能多的容器).

考虑到这一点是有益的使用语法,通用于所有的容器和迭代器在可能的情况.

只有一些容器的迭代器允许<比较,但所有容器的迭代器都接受!=.出于这个原因,我建议始终使用!=一致性,并方便您的代码轻松移植到不同的容器.

  • 关于最后一段:更一般地说,只有一些迭代器类型允许`<`比较,但所有迭代器类型(除了简单的输出迭代器)都接受`!=`.容器是迭代器的一个来源,但它们不是唯一的. (2认同)

Dem*_*nes 9

它确实有所作为,尽管不是std::vector.所有迭代器都是可比较的,所以它!=总能工作.只有随机访问迭代器不太可比,std::vector因此在您的情况下,它不会是一个大问题.

  • 并非所有迭代器都具有可比性.例如,输出迭代器. (2认同)