C++反向迭代器

3

在C++中是否可以反转迭代器?

例如,许多算法都是基于传递起始和结束迭代器的原则设计的:

template <typename T>
void func( Iterator begin, Iterator end ){
    ...
}

现在假设,在内部,我需要在容器中前后迭代:

template <typename T>
void func( Iterator begin, Iterator end ){
    // Iterate forward 
    ...
    // Iterate backward
    ...
}

我可以向std:advance传递负值,但我想知道是否可以将迭代器转换为反向迭代器。这可行吗?


2
用户将反向迭代器传递给“func”。为什么需要更改您的函数? - PaulMcKenzie
抱歉,我的表述不够清晰。在内部,我需要在容器中前进和后退。 - bremen_matt
留给用户来决定。如果用户想要遍历“从左到右,再从右到左”或“从右到左,再从左到右”,那就由用户自行决定。 - PaulMcKenzie
为什么不使用一些双向运算符作为参数类型? - Jean-Baptiste Yunès
2个回答

10

您可以对参数调用std::make_reverse_iterator来获取范围的反向视图。cpp参考页面有一个演示。当然,这是假设可逆转的情况。


啊哈。我知道肯定有这样的东西。只是我找不到它。 - bremen_matt
1
这是一个很好的答案(正如你可以从StoryTeller期望的那样),但请注意,正如他所说,这并不总是有效的。 - Bathsheba
还要注意,使用类模板参数推导而不是相应的 make_* 函数模板可以节省 5 个字符的输入。 - lubgr

7
不可能在完全的一般情况下实现。例如,考虑一个单向链表,您只能沿一个方向迭代(即它是“前向可迭代的”,但不是“双向可迭代的”)。
在您的情况下,解决方案是调用函数的调用者传递反向迭代器。
参考:https://en.cppreference.com/w/cpp/experimental/ranges#Iterators

1
@Jean-BaptisteYunès - 你如何反向迭代输入流?或者正向链表? - StoryTeller - Unslander Monica
3
我不太确定那算不算。在那个点上,你正在对数据进行向后迭代,创建新的数据,这完全是另一回事了。 - Lightness Races in Orbit
1
@Jean,你的迭代器没有存储东西,算法是在存储。我想不出有何禁止它这样做的理由,但我可以想出许多你不希望它这样做的原因。当然,你可以通过信鸽将所有数据复制到离线服务器上,并通过拨号调制解调器上的莫尔斯电码进行操作,但这会违反最少惊讶原则,性能也不会被任何人接受。 - Lightness Races in Orbit
1
@Jean-BaptisteYunès - 我有一种感觉,你刚才忽略了 Lightness Races in Orbit 和我说的一切。 - StoryTeller - Unslander Monica
1
我在某种程度上同意 @Jean-BaptisteYunès 的观点,因为有时候我需要做一些事情,无论它有多么不合理,然后得到一个回答说这是不可能的并不好。但我也在某种程度上不同意,因为如果算法不需要真正地复制内容,那么把东西拷来拷去是不合理的。 - 463035818_is_not_a_number
显示剩余17条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接