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

时间:2013-12-31 11:00:41

标签: c++ stl

我想在C ++中遍历一个列表,但直到最后一直到最后才排在第五位。 但我发现没有定义“ - ”运算符,所以我可以使用

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

我可以使用size()函数以某种方式保持计数等但是还有其他直接的方法吗?

5 个答案:

答案 0 :(得分:6)

Count是唯一可能无法以某种方式有效遍历列表的实用方法。

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

您可以使用std::advance将迭代器从最后获得到第五个。

答案 3 :(得分:1)

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

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, " " ) );

答案 4 :(得分:1)

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

例如:

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