Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL列表访问上一个元素的下一个元素_C++_List_Stl - Fatal编程技术网

C++ STL列表访问上一个元素的下一个元素

C++ STL列表访问上一个元素的下一个元素,c++,list,stl,C++,List,Stl,如何让迭代器指向STL列表中倒数第二个元素,而不创建临时元素并修改列表? 是否可以只说:--(-mylist.end())?或者这会因为前缀减量而改变列表的结束迭代器吗?如果可以使用反向迭代器,则:一些列表.rbegin()+1请注意,一般来说,--mylist.end()不保证为每个容器编译 例如,如果在发布模式下使用std::vector或std::array,mylist.end()可能是原始指针,并且不能减少函数返回值的指针 当然,在检查列表是否足够长之后,C++11中解决此问题的一般方

如何让迭代器指向STL列表中倒数第二个元素,而不创建临时元素并修改列表?
是否可以只说:
--(-mylist.end())
?或者这会因为前缀减量而改变列表的
结束
迭代器吗?

如果可以使用
反向迭代器
,则:
一些列表.rbegin()+1

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

例如,如果在发布模式下使用
std::vector
std::array
mylist.end()
可能是原始指针,并且不能减少函数返回值的指针

当然,在检查列表是否足够长之后,C++11中解决此问题的一般方法是std::prev(std::prev(mylist.end())
。为此,您需要
#包括

您可以使用和反向迭代器:

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

即使所讨论的迭代器类型不支持
operator+

您可能想看看这个:有趣。但是为什么我不能减少由值返回的指针呢。这就是为什么它不更改
end
迭代器本身,因为按值返回是因为对按值返回的函数的调用是右值,但标量(如int或原始指针)的
--
运算符需要左值。只要试试
--newt(),您将得到一个编译器错误,说“需要作为减量操作数的左值”或类似的话。另一方面,在临时对象上调用操作符
--
也很好,只要它是作为成员函数实现的。实际上,它不适用于后缀
--
,因为后缀通常作为一个自由函数实现(就前缀
--
而言,以避免代码重复),不作为成员函数。假设
some_list
std::list
迭代器将不支持
operator+
std::list支持双向迭代器;正如Nim所说,只需调用方法rbegin(),并使用操作符++或向前迭代器获取以下元素:
autoit=myList.end();std::advance(it,-2)