簡體   English   中英

C ++迭代器到鏈表的最后一個元素?

[英]C++ iterator to last element of a linked list?

我想將::iterator獲取到list的最后一個元素。

我的理解是,您可以使用.begin()將迭代器添加到列表的.front() .begin() ,但是.back()呢? 由於列表邊界不包含final元素,因此.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())似乎不起作用,因為它不會導致迭代器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM