You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用双向迭代器反向遍历至首个元素(含该元素)?

如何用双向迭代器反向遍历至(并包含)首个元素?

你遇到的问题核心在于:原循环的终止条件it != set.begin()会让迭代器指向首个元素时直接退出循环,导致第一个元素没被处理。要解决这个问题,我们可以调整循环逻辑,确保首个元素被纳入处理范围,同时还要注意空集合的边界情况(避免对end()执行--操作导致未定义行为)。

方案一:使用 do-while 循环(最直观)

先确保迭代器指向有效元素,再用do-while先执行一次处理逻辑,再判断是否需要继续递减:

// 先处理迭代器处于 end() 的情况,同时判断集合是否为空
if (it == set.end()) {
    if (set.empty()) {
        return; // 空集合无需处理
    }
    it--; // 移动到最后一个有效元素
}

do {
    // 处理当前元素 *it
    // Do something

    // 已经到首个元素,退出循环
    if (it == set.begin()) {
        break;
    }
    // 未到首个元素,继续向前移动
    it--;
} while (true);

方案二:调整循环顺序(先处理,再判断)

如果不想用do-while,也可以用无限循环配合条件判断,逻辑和上面一致:

if (it == set.end()) {
    if (set.empty()) {
        return;
    }
    it--;
}

while (true) {
    // 处理当前元素 *it
    // Do something

    if (it == set.begin()) {
        break;
    }
    it--;
}

为什么原代码不行?

原循环的逻辑是先判断再处理:当迭代器移动到begin()时,it != set.begin()不成立,循环直接终止,导致*begin()这个元素根本没进入处理逻辑。而上面的方案都是先处理当前元素,再判断是否需要继续移动,确保首个元素被处理后才退出。

额外注意:空集合的边界检查

无论哪种写法,都必须先判断集合是否为空。如果集合是空的,begin()和end()是同一个位置,此时对it执行--操作属于未定义行为,必须提前规避。

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:13:08