如何从结束到开始迭代unordered_set

How to iterate an unordered_set from the end to the begin

本文关键字:迭代 unordered set 开始 结束      更新时间:2023-10-16

我想从头到尾迭代一个unordered_set:

unordered_set<Expression*> BlocExpressions;
for(auto it=BlocExpressions.end(); it != BlocExpressions.begin(); it--)
{
    //do some work
}

但没有宣布operator--

那么,我应该编写operator--,还是有办法做到这一点?

对于std::unordered_set,你遍历元素的顺序并不重要。话虽如此,你可以想象顺序是随机的。无论您进行前向迭代还是向后迭代,您都不会获得特定的顺序。这就是为什么它不提供反向迭代器,也没有为普通迭代器提供--运算符重载。向前和向后迭代在这里具有相同的语义:以随机顺序迭代。

我不明白你为什么用"结束"和"开始"这两个词来表示unordered_set unordered_set没有特定的顺序。可以使用迭代器对象循环访问所有元素。如果你需要在集合中排序,你应该使用其他容器,例如std::set

我也觉得很好奇为什么没有 rbegin() 和 rend()。我正在使用unordered_set添加随机数(无序)来表示某个路径。那就太好了。

我找到的解决方案,它可能会帮助其他人是以下解决方案。在 for 循环的第一个参数中添加递减: auto it = --BlocExpressions.end()

unordered_set<Expression*> BlocExpressions;
for(auto it = --BlocExpressions.end(); ; it--){   
    //do some work
    // This will include the last item (which is BlocExpressions.begin())
    if(it == BlocExpressions.begin()){
        break;
    }
}