【问题标题】:How get next (previous) element in std::list without incrementing (decrementing) iterator?如何在不递增(递减)迭代器的情况下获取 std::list 中的下一个(上一个)元素?
【发布时间】:2023-03-14 10:16:02
【问题描述】:

假设我有一个 std::list<int> lst 和一些 std::list<int>::iterator it 用于遍历列表。并取决于我想在我的代码中使用it + 1it - 1it 的值。有没有像next()prev() 这样的好方法(我在 stl 文档中找不到这样的东西)?还是我应该每次都复制it 并增加(减少)副本?

【问题讨论】:

  • 当您执行it++ 时,它会转换为it = it + 1,这意味着从技术上讲,迭代器对象每次都可以是一个新对象。不知道你在问什么。
  • 复制和增加/减少副本是唯一的方法。您可以编写包装函数来隐藏它(正如答案中提到的,C++11 有 std::prev/std::next 可以做到这一点。但它们是围绕这个“复制和递增”操作的包装器
  • 谢谢@jalf。您的答案是唯一完整的答案。
  • @elusive 我已将"it + 1""it - 1" 放在引号中,因为它们不是双向迭代器的有效操作。你介意我把它们加回来吗?
  • @MihranHovsepyan:如果你愿意,你可以把引号放回去。我不认为它们是必要的(因为已经很清楚这是你想要做的,但它不能做到)。谢谢,我会把它作为答案发布:)

标签: c++ list iterator


【解决方案1】:

是的,从 C++11 开始,您正在寻找两种方法,称为 std::prevstd::next。您可以在迭代器库中找到它们。

来自 cppreference.com 的示例

#include <iostream>
#include <iterator>
#include <vector>

int main() 
{
    std::list<int> v{ 3, 1, 4 };

    auto it = v.begin();

    auto nx = std::next(it, 2);

    std::cout << *it << ' ' << *nx << '\n';
}

输出:

3 4

【讨论】:

  • 当然,如果你没有 C++11,它们也很容易实现。 (我认为我们中的大多数人甚至在 C++11 提出它们之前就已经将它们包含在我们的工具包中。)
【解决方案2】:

复制和增加/减少副本是唯一的方法。

您可以编写包装函数来隐藏它(正如答案中提到的,C++11 有 std::prev/std::next 可以做到这一点(并且 Boost 定义了类似的函数)。但它们是围绕这个的包装器“复制和递增”操作,所以你不必担心你做错了。

【讨论】:

    【解决方案3】:

    一个简单的预设解决方案是来自Boost.utilitypriornext。他们利用了operator--operator++,但不需要你创建一个临时的。

    【讨论】:

    • 当然应该提一下1.他们自己创建临时和2.你最好注意边界条件。
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2017-05-24
    • 2021-05-04
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多