C++中for(auto it : vector)遍历是否会严格按元素顺序执行?
结论
你完全可以确定这个循环是严格按照vector元素的存储顺序从第一个到最后一个遍历的,不会出现乱序情况。
原理说明
C++标准明确规定,针对支持迭代器的标准容器,范围for循环的底层执行逻辑等价于下面的代码:
auto&& range = a; auto iter = range.begin(); auto end = range.end(); for (; iter != end; ++iter) { auto i = *iter; // 你的循环体逻辑 }
std::vector的迭代器属于随机访问迭代器,begin()返回指向容器第一个元素的迭代器,每次执行++iter都会按顺序移动到下一个相邻元素,直到命中end()指向的尾后位置终止,遍历顺序和元素在vector中的存储顺序完全一致。
注意事项
- 只有使用
std::unordered_map、std::unordered_set这类无序容器时,范围for的遍历顺序才是不确定的,这是由这类容器本身的哈希存储结构决定的。 - 如果遍历过程中修改了原vector的容量(比如插入元素触发扩容、删除元素),会导致迭代器失效,此时遍历行为属于未定义行为,不在正常遍历的顺序讨论范围内。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

