打印列表,显示错误,表示迭代器不可递减

时间:2017-03-28 15:19:20

标签: c++ list class

我正在尝试创建一个应该使用列表复制堆栈的成员函数。所以我必须以相反的顺序打印列表的元素。 我在头文件中声明了一个私有列表:

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 << " | ";
    }
}

但我仍然得到错误。

2 个答案:

答案 0 :(得分:4)

您的代码有两个问题。首先while (iter != content.end())将始终为真,因为您向前走content.end()。其次,即使将其更改为while (iter != content.begin()),您也会错过列表中的第一个迭代器

向后移动列表的方法是使用反向迭代器。 std::listrbegin()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()以及反向迭代器。