如何在没有最后一个元素的情况下迭代列表

How to iterate a list without the last element

本文关键字:情况下 迭代 列表 元素 最后一个      更新时间:2023-10-16

我想做的只是迭代一个 std::list,除了最后一个元素。我正在尝试什么:

#include <cstdlib>
#include <list>
int main() {
  std::list<int> *list = new std::list<int>(100);
  std::list<int>::iterator it;
  for (it = list->begin(); it != list->end()-1; it++) {
    // some action here...
  }
}

但是,这将行不通。怎么了?

std::list使用双向迭代器,该迭代器不支持operator-。改用std::prev

for (it = list->begin(); it != std::prev(list->end()); it++) {
  // some action here...
}

关于为什么失败的原因:

list::iteratorBidirectionalIterator。它不能使用operator-降低,也不能使用operator+增加。这些操作是为RandomAccessIterator的模型保留的。但是,您可以使用operator--将其降低。

std::list<int> x;
// --end(x) would work as well here, but I don't recommend it
auto end = end(x); 
--end;
// or even better
end = std::prev(end(x));
for(auto it = begin(x); it != end; ++it) {
}

另外,请放下指针。您的简单示例已经在泄漏内存。