我有一个std::list<some_object> events
,我想删除该列表中除最后一个元素之外的所有元素。因此,我想到了这样做(如该线程所建议):
std::list<some_object>::iterator it = events.begin(); // Init iterator on top of list
while(it!=*std::advance(events.end(),-1)) events.erase(it++);
不幸的是,上面的方法不起作用,因为它会产生错误:
error: invalid initialization of non-const reference of type ‘std::_List_iterator<node_info>&’ from an rvalue of type ‘std::__cxx11::list<node_info>::iterator {aka std::_List_iterator<node_info>}’
while(it!=*std::advance(event_heap.end(),-1)){
但是,不list::end
应该返回迭代器吗?我究竟做错了什么?
但是,list :: end是否不应该返回迭代器?
是的,但是std::advance
将非常量引用作为其第一个参数,而这event_heap.end()
是一个临时变量,不能绑定到非常量引用。
并且不std::advance
返回任何内容(即void
),因此您无法使用operator*
它或将其与进行比较it
。
直接修复将如下所示:
std::list<some_object>::iterator it = events.begin();
auto one_before_end = events.end();
std::advance(one_before_end, -1); // or --one_before_end;
while (it != one_before_end) events.erase(it++);
顺便说一句:std::list::erase
具有重载迭代器范围,因此您可以:
events.erase(events.begin(), one_before_end);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句