【问题标题】:Iterator to last element in std::liststd::list 中最后一个元素的迭代器
【发布时间】:2011-02-10 07:31:40
【问题描述】:
#include <list>
using std::list;

int main()
{
    list <int> n;
    n.push_back(1);
    n.push_back(2);
    n.push_back(3);

    list <int>::iterator iter = n.begin();
    std::advance(iter, n.size() - 1); //iter is set to last element
}

有没有其他方法可以迭代到列表中的最后一个元素?

【问题讨论】:

  • 出于某种原因,我不想拥有 reverse_iterator。

标签: c++ stl


【解决方案1】:

以下任何一项都会将std::list&lt;int&gt;::iterator 返回到list 中的最后一项:

std::list<int>::iterator iter = n.end();
--iter;

std::list<int>::iterator iter = n.end();
std::advance(iter, -1);

// C++11
std::list<int>::iterator iter = std::next(n.end(), -1);

// C++11
std::list<int>::iterator iter = std::prev(n.end());

以下将std::list&lt;int&gt;::reverse_iterator返回到list中的最后一项:

std::list<int>::reverse_iterator iter = std::list::rbegin();

【讨论】:

  • std::list&lt;int&gt;::iterator iter = --n.end(); 是否也能正常工作,还是只有在分配后才会减量?
  • @mbrandalero 它应该可以正常工作。递减的结果会赋值给变量
  • @RemyLebeau 这可能并不总是有效(即对于更一般的迭代器,而不仅仅是类类型的迭代器),因为迭代器不需要是可修改的左值。请参阅Why can't I decrement std::array::end()? 进行良好讨论。所以,基本上,用std::prev() 包裹它是更好的风格。
  • @mbrandalero 如果使用预减量可用于给定的迭代器(见上面的评论),减量必须在分配之前完成,因为是整个世界都期望前缀运算符工作的方式,任何不这样做的迭代器都会被严重破坏。
【解决方案2】:

您可以编写自己的函数来从给定的迭代器中获取上一个(和下一个)迭代器(当我需要“后视”和“前瞻”时使用 std::list):

template <class Iter>
Iter previous(Iter it)
{
    return --it;
}

然后:

std::list<X>::iterator last = previous(li.end());

顺便说一句,这也可能在 boost 库中可用 (next and prior)。

【讨论】:

  • 这在 C++0x 中也可用(std::nextstd::prev)。
【解决方案3】:
std::list<int>::iterator iter = --n.end();
cout << *iter;

【讨论】:

【解决方案4】:
list<int>n;
list<int>::reverse_iterator it;
int j;

for(j=1,it=n.rbegin();j<2;j++,it++)
cout<<*it;

【讨论】:

  • 解释您发布的代码将使您的答案更好。
【解决方案5】:

乘坐end() 并向后走一个。

list <int>::iterator iter = n.end();
cout << *(--iter);

【讨论】:

  • 为什么我必须倒退一首?有没有一个虚拟的端节点什么的?
  • @Tarion: n.end() 不指向最后一个元素,而是指向列表末尾。
【解决方案6】:

使用反向迭代器:

iter = (++n.rbegin()).base()

附带说明:此方法或 Charles Bailey 方法具有恒定的复杂性,而 std::advance(iter, n.size() - 1); 具有列表的线性复杂性 [因为它具有双向迭代器]。

【讨论】:

  • 为什么是 "++n.rbegin()" ?对我来说,这似乎是倒数第二个元素的反向迭代器。 “n.rbegin().base()”(没有“++”)不是最后一个元素的迭代器吗?
  • @JoséX。 base() 不仅仅是将反向迭代器转换为正向迭代器的简写。查看此回复以获取有关 base 的更多信息:stackoverflow.com/a/16609146/153861
【解决方案7】:

是的,你可以从最后一回。 (假设您知道该列表不为空。)

std::list<int>::iterator i = n.end();
--i;

【讨论】:

  • 在某些地方可以缩短如newlist.splice(--newlist.end(),oldlist);
猜你喜欢
  • 2011-02-11
  • 2018-04-13
  • 2013-02-20
  • 1970-01-01
  • 2016-02-12
  • 2016-08-29
  • 2018-02-13
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多