1

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

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

4

2 回答 2

4

至于为什么会失败:

Alist::iterator是一个BidirectionalIterator。不能使用 递减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) {

}

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

于 2012-11-10T00:42:16.493 回答
4

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

for (it = list->begin(); it != std::prev(list->end()); it++) {
  // some action here...
}
于 2012-11-10T00:35:27.010 回答