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)
Gal*_*lik 10
STL标准库(容器,迭代器和算法)部分背后的整个哲学是最小化容器之间的程序区别.它们具有不同的属性,但是如何对它们进行编程的设计尽可能相似.
这使得它们更容易学习并且更容易一般地使用.这意味着您可以编写一个通用函数(或算法)并将其应用于任何其他容器(或尽可能多的容器).
考虑到这一点是有益的使用语法,通用于所有的容器和迭代器在可能的情况.
只有一些容器的迭代器允许<比较,但所有容器的迭代器都接受!=.出于这个原因,我建议始终使用!=一致性,并方便您的代码轻松移植到不同的容器.
它确实有所作为,尽管不是std::vector.所有迭代器都是可比较的,所以它!=总能工作.只有随机访问迭代器不太可比,std::vector因此在您的情况下,它不会是一个大问题.