C ++为什么“deque iterator not dereferencable”

时间:2017-06-24 02:56:12

标签: c++

我正在https://kensetsutenshokunavi.jp/

进行样本测试

“通过从左侧和右侧安装和拆卸货车来构建TrainComposition。例如,如果我们从左侧安装货车7然后再从左侧安装货车13开始,我们得到组合两辆货车(从左到右分别为13和7)。现在可以从右侧拆卸的第一辆货车是7号,第一辆可以从左侧拆卸的货车是13号。实施一个模拟这个问题的TrainComposition。“

我使用std :: deque修改了代码,但是当我构建它时,会发生错误:“deque iterator not dereferencable”。为什么会出现此错误以及如何解决?

    #include <stdexcept>
#include <iostream>
#include <deque>

class TrainComposition
{
    //std::vector<int> wagons;

public:

    std::deque<int> wagons;

    void attachWagonFromLeft(int wagonId)
    {
        wagons.push_front(wagonId);
    }

    void attachWagonFromRight(int wagonId)
    {
        wagons.push_back(wagonId);
    }

    int detachWagonFromLeft()
    {
        std::deque<int>::iterator it = wagons.begin();
        wagons.pop_front();
        return *it;
    }

    int detachWagonFromRight()
    {
        std::deque<int>::iterator it = wagons.end()-1;
        wagons.pop_back();
        return *it;
    }
};

#ifndef RunTests
int main()
{
    TrainComposition tree;
    tree.attachWagonFromLeft(7);
    tree.attachWagonFromLeft(13);
    std::cout << tree.detachWagonFromRight() << "\n"; // 7 
    std::cout << tree.detachWagonFromLeft() << "\n"; // 13
    return 0;
}
#endif

1 个答案:

答案 0 :(得分:0)

detachWagonFromLeft()中的这一系列说明是一个问题:

std::deque<int>::iterator it = wagons.begin();
wagons.pop_front();
return *it;

将迭代器保存到第一个元素,但pop_front()然后使该迭代器无效。取消引用无效的迭代器是未定义的行为。

我建议使用这个更简单的版本:

int temp = wagons.front();
wagons.pop_front();
return temp;

detachWagonFromRight()函数中存在类似的问题,可以修复为:

int temp = wagons.back();
wagons.pop_back();
return temp;