0

如何在不创建临时列表和修改列表的情况下获取 STL 列表中倒数第二个元素的迭代器?是否可以只说:--(--mylist.end())?或者这会end由于前缀递减而改变列表的迭代器吗?

4

3 回答 3

3

请注意,一般来说,--mylist.end()不保证为每个容器编译。

例如,如果您在释放模式下使用std::vector或,则可能是原始指针,并且您不能递减由函数返回的值的指针。std::arraymylist.end()

C++11 中这个问题的一个通用解决方案是std::prev(std::prev(mylist.end())),当然,在检查列表是否足够长之后。你需要#include <iterator>为此。

于 2012-07-12T10:24:45.670 回答
3

您可以使用std::advance和 reverse_iterator:

SomeContainerType::reverse_iterator it = myList.rbegin();
std::advance(it, 1); // next to last element

即使有问题的迭代器类型不支持,这也有效operator+

于 2012-07-12T10:44:48.767 回答
2

如果可以接受 a reverse_iterator,那么:some_list.rbegin() + 1;

于 2012-07-12T10:17:42.130 回答