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

时间:2012-11-10 00:34:01

标签: c++ iterator

我想要做的只是迭代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...
  }
}

但是,这不起作用。有什么问题?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

至于为何失败:

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) {

}

另外,请放下指针。你的简单例子已经泄漏了内存。