C++链表最后一个元素的迭代器?
C++ iterator to last element of a linked list?
我想把::iterator
到list
的最后一个元素。
我的理解是,您可以使用.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())
似乎不起作用,因为它不会导致迭代器。
相关文章:
- 对于set上的循环-获取next元素迭代器
- 访问要输出的矢量迭代器元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 如何通过查找迭代器结果分配给一组对的元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 将迭代器作为 3 个元素的滑动窗口,可以超调边界(可能使用 Boost)
- C++链表最后一个元素的迭代器?
- 使用索引与迭代器将向量迭代到倒数第二个元素
- 提升堆元素句柄比较和 MSVC 迭代器调试工具
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 使用迭代器打印矢量元素
- C++ std::vector语言 - 如何修改迭代器指定的元素?
- 你能pop_back一个向量,并且仍然使用迭代器到最后一个元素吗?
- 优先级队列(使用 pairs<int,int> ) 根据 for 循环迭代器的顶级元素
- C++ 当容器在使用前被破坏/修改时发出警告(通过引用元素或迭代器使用)
- 如何从该列表的元素中获取 std::list<T>::迭代器?
- 如何在c++中记忆迭代器元素