遍历vector时,为何推荐用it != vector.end()而非it < vector.end()?
!=而非<? 嘿,这个问题问得很到位!咱们来聊聊这两种遍历写法的区别,以及为什么!=会成为更主流的选择:
通用性拉满,适配所有容器
这是最核心的原因!C++里不是所有容器的迭代器都支持<这类关系运算符。比如std::list、std::map、std::unordered_set这些容器的迭代器是双向迭代器或者无序迭代器,它们只支持==和!=的比较,根本没法用<。如果你习惯用it != container.end()的写法,哪天需要把vector换成list,代码不用改一行就能正常编译运行;但如果用的是<,直接就会编译报错,得挨个修改判断条件,太麻烦了。语义更贴合遍历意图
遍历的本质是“从容器起始位置出发,一直走到末尾就停下”。it != vector.end()直接表达了“当前迭代器还没到达末尾”的语义,逻辑上更直观;而it < vector.end()是在判断“当前迭代器的位置在末尾之前”——虽然对于vector的随机访问迭代器来说,两者效果完全一样,但语义上!=更贴合我们遍历的初衷。关于你提到的“删除/跳转场景更安全”
其实这里可能有个小误解:不管用!=还是<,如果遍历过程中操作容器导致迭代器失效(比如erase元素后end迭代器变化,或者迭代器跳转超出范围),两种写法都会出问题。真正的安全在于正确处理迭代器失效的情况,比如vector erase后要更新迭代器:it = vec.erase(it);,这时候两种判断方式都能正常工作,不存在谁更安全的说法。
至于为什么不统一用<?除了上面说的通用性差之外,C++标准库的示例、主流的代码规范里都默认用!=,这是一种约定俗成的写法,遵循它能让你的代码更易读,其他开发者一看就懂,减少沟通成本。
补充一句你提到的点:对任意容器来说,!=确实比<更具通用性,这也是它成为首选写法的关键原因。
内容的提问来源于stack exchange,提问作者MrJonas

