C++链表最后一个元素的迭代器?

C++ iterator to last element of a linked list?

本文关键字:迭代器 元素 链表 最后一个 C++      更新时间:2023-10-16

我想把::iteratorlist的最后一个元素。

我的理解是,您可以使用.begin()将迭代器带到列表的.front(),但是.back()呢? 由于列表边界不包含最后一个元素,因此.end()将是经过列表back()元素的迭代器。

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

该算法对于任何双向容器都是相同的:

#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

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

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(( 如果列表为空。

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

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

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

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