我正在尝试创建一个应该使用列表复制堆栈的成员函数。所以我必须以相反的顺序打印列表的元素。 我在头文件中声明了一个私有列表:
class miniStackLT {
private:
list<T> content;
我有以下代码用于该功能:
template <typename T>
void miniStackLT<T>::PrintStack(){
list<T>::iterator iter;
iter = content.end();
iter--;
while (iter != content.end()) {
cout << *iter << " | ";
iter--;
}
}
当我运行程序时,我检查了so列表的大小,它告诉我正确的数字但是当我打印它时,它打印正确的元素然后我得到一个错误,说明列表迭代器不可减少。
导致此错误的原因是什么?我已经尝试搞乱循环的起点和终点以及迭代器,但我不断收到错误。
编辑:我也用过
template <typename T>
void miniStackLT<T>::PrintStack(){
list<T>::iterator rit;
for (auto rit = content.rbegin(); rit != content.rend(); ++rit){
cout << *iter << " | ";
}
}
但我仍然得到错误。
答案 0 :(得分:4)
您的代码有两个问题。首先while (iter != content.end())
将始终为真,因为您向前走content.end()
。其次,即使将其更改为while (iter != content.begin())
,您也会错过列表中的第一个迭代器
向后移动列表的方法是使用反向迭代器。 std::list
有rbegin()
和rend()
,它们为您提供开始和结束迭代器,但它们会向后遍历列表,因此rbegin()
会为您提供列表中的最后一个元素。走到列表,你会使用像
for (auto rit = content.rbegin(); rit != content.rend(); ++rit)
您也可以使用基于范围的for循环。使用from here代码Prikso NAI,您就可以拥有
for (const auto& e : reverse(content))
std::cout << e << " | ";
答案 1 :(得分:0)
在某些时候,您会到达content.begin()
。在那之后,它不会减少。
将条件更改为while (iter != content.begin())
应解决此问题。
但是你应该考虑使用rbegin()
和rend()
以及反向迭代器。