如何在 c++ 列表中遍历固定数量的元素

How to traverse fixed number of elements in c++ list

本文关键字:元素 遍历 c++ 列表      更新时间:2023-10-16

我想遍历C++列表中的列表,但只能从倒数第五到最后。但是我看到没有定义"-"运算符,因此我可以使用

list<>::iterator j=i-5;

我可以使用size()功能以某种方式保持计数等来做到这一点,但是还有其他直接方法吗?

计数是唯一可能不涉及以某种方式有效遍历列表的实用方法。

auto myEnd = std::advance(myList.end(),-5)

但这只会遍历最后五个列表元素以达到您想要的点,因此它并不比大多数其他解决方案更快或更优雅。但是,使用整数循环确实需要同时保留整数计数和迭代器,这实际上只需要迭代器,因此在这方面可能会更好。

如果你的<list>有一个 O(1) 计数,并且从末端到端的距离很大,请使用整数循环,否则上面很好。

List 不支持随机访问迭代器。可以使用反向迭代器和计数器。

您可以使用

std::advance将迭代器从最后一个迭代器获取到第五个迭代器。

该列表具有双向迭代器。因此,要从结束迭代器中获取第五个迭代器,您应该应用操作 5 次 - 这是为双向迭代器定义的。C++标准提供了两个执行此任务的功能。2003 C++出现的第一个是std::advance。2011 C++出现的第二个是std::p rev。使用第二个函数 std::p rev 更简单,因为它返回所需的迭代器。例如

std::list<int> l = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::copy( l.begin(), std::prev( l.end(), 5 ), std::ostream_iterator<int>( std::cout, " " ) );

除了可用的答案之外,我建议坚持使用标准算法来遍历列表,而不是直接处理迭代器; 如果你能避免它。

例如:

auto l = list<int>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for_each(begin(l), prev(end(l), 5), [](const int& i) {
    cout << i << endl;
});

http://ideone.com/6wNuMP