【问题标题】:C++ iterator to last element of a linked list?C ++迭代器到链表的最后一个元素?
【发布时间】:2018-07-08 19:03:38
【问题描述】:

我想将::iterator 放到list 的最后一个元素。

我的理解是你可以用.begin()得到列表的.front()的迭代器,但是.back()呢?由于列表边界不包括最后一个元素,.end() 将是列表的 back() 元素之后的迭代器。

我尝试使用.rbegin(),从逻辑上讲这似乎正是我想要的,但它似乎返回了reverse_iterator 类型,这导致我的代码类型不匹配。

【问题讨论】:

  • 你的代码是什么? rbegin() 是正确使用的函数,为什么您的代码不能与 reverse_iterator 一起使用?
  • @AlanBirtles,因为它的类型是 iterator,而不是 reverse_iterator,而且它们似乎没有映射
  • 但是为什么你的代码必须使用iterator?这就是模板代码的用途
  • @AlanBirtles 如果不使用list<…>::iterator,我还能如何将指向std::list 链表元素的指针保存在std::map 中?这是针对 LRU 缓存的 C++ 实现,并且根据相关问题,我的方法已经产生了最佳运行时! stackoverflow.com/a/51236501/1122270
  • 好吧,如果它在您的问题中说...发布minimal reproducible example,获得正确答案

标签: c++ list iterator listiterator


【解决方案1】:

算法对于任何双向容器都是一样的:

#include <list>
#include <stdexcept>
#include <iostream>
#include <vector>
#include <set>


template<typename Container>
auto iter_to_last(Container&& cont)
{
    auto last = std::end(cont);
    if (last == std::begin(cont))
    {
        throw std::invalid_argument("container is empty");
    }
    return std::prev(last);
}

int main()
{
    auto l = std::list<int> { 1, 2, 3 };
    std::cout << *iter_to_last(l) << std::endl;
    std::cout << *iter_to_last(std::set<int> { 1, 2, 3 }) << std::endl;
    std::cout << *iter_to_last(std::vector<int> { 1, 2, 3 }) << std::endl;
}

预期输出:

3
3
3

【讨论】:

    【解决方案2】:

    如果列表支持双向迭代器,则使用

    auto last = list.empty() ? list.end() : std::prev(list.end());
    

    对于像 forward_list 这样的单向列表,从头开始遍历列表是唯一的选择(至少据我所知):

    auto last = list.end();
    for (auto it = list.begin(); it != list.end(); last = it++);
    

    last 指向最后一个元素,如果列表为空,则指向 list.end()。

    【讨论】:

    • 警告:在空列表中使用此代码的程序的行为是未定义的。
    • 谢谢,我已经添加了条件检查。
    【解决方案3】:

    另一个可能的答案(对于非空列表)是--l.end()

    如果std::list 不为空,那么最后一个元素的以下选项似乎可用:

    • --l.end()
    • prev(l.end())

    请注意,&amp;(l.back()) 似乎不起作用,因为它不会生成迭代器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-05
      • 2020-08-16
      • 1970-01-01
      • 2013-02-20
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多