链表最后一个元素的 C++ 迭代器?
C++ iterator to last element of a linked list?
我想获取 ::iterator
到 list
的最后一个元素。
我的理解是,你可以用.begin()
得到列表.front()
的迭代器,但是.back()
呢?由于列表边界不包含最后一个元素,.end()
将是列表的 back()
元素之后的迭代器。
我试过使用 .rbegin()
,从逻辑上讲这似乎正是我想要的,但它似乎是 return 一个 reverse_iterator
类型,这导致类型不匹配对于我的代码。
如果列表支持双向迭代器,使用
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()。
任何双向容器的算法都是相同的:
#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
另一个可能的答案(对于非空列表)是 --l.end()
。
如果 std::list
不为空,则最后一个元素的以下选项似乎可用:
--l.end()
prev(l.end())
请注意,&(l.back())
似乎不起作用,因为它不会生成迭代器。
我想获取 ::iterator
到 list
的最后一个元素。
我的理解是,你可以用.begin()
得到列表.front()
的迭代器,但是.back()
呢?由于列表边界不包含最后一个元素,.end()
将是列表的 back()
元素之后的迭代器。
我试过使用 .rbegin()
,从逻辑上讲这似乎正是我想要的,但它似乎是 return 一个 reverse_iterator
类型,这导致类型不匹配对于我的代码。
如果列表支持双向迭代器,使用
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()。
任何双向容器的算法都是相同的:
#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
另一个可能的答案(对于非空列表)是 --l.end()
。
如果 std::list
不为空,则最后一个元素的以下选项似乎可用:
--l.end()
prev(l.end())
请注意,&(l.back())
似乎不起作用,因为它不会生成迭代器。