【问题标题】:Deque iterator not dereferenceableDeque 迭代器不可取消引用
【发布时间】:2017-01-21 18:57:31
【问题描述】:

所以我一直在尝试文件输入和输出来保存 Yugioh 套牌列表,并且我大部分时间都在工作。我使用双端队列来存储一个名为 Card 的类对象,其中包含所有信息,并使用一个 Deck 类来保存每种类型的卡组、主卡、侧卡和额外卡对象的双端队列。

所以,无论如何,解决问题。我正在使用本地双端队列来保存先前加载的卡的信息,因为当我加载每张卡时,我会在双端队列中搜索完全匹配的内容,然后将数字存储在变量中以用于输出。当我尝试添加到这个名为“已处理”的本地双端队列时,出现错误。

调试断言失败!表达式:deque 迭代器不可取消引用

void Deck::SaveDeck(std::string filename)
{
    std::ofstream outFile;
    outFile.open(filename.c_str());

    //send the file the deck name
    outFile << this->deckName << "\n";

    //send the deck sizes
    outFile << main_deck_size << " " << side_deck_size << " " << extra_deck_size << "\n";

    //iterator to iterate through the entire deck looking for copies
    std::deque<Card>::iterator iter = main_deckCards.begin();
    std::deque<Card>::iterator iter2 = main_deckCards.begin();

    //deque to hold previously added cards
    std::deque<Card> processed;
    std::deque<Card>::iterator processed_iter = processed.begin();

    string setNAME = "";
    int setNum = 0;
    int quantity = 0;
    bool is_processed = false;

    for (int i = 0; i < main_deck_size; i++)
    {
        //reset processed flag
        is_processed = false;

        //check processed queue for exact card
        for (int j = 0; j < processed.size(); j++)
        {
            if (iter[i].SET_NAME == processed_iter[j].SET_NAME && iter[i].SET_NUM == processed_iter[j].SET_NUM)
            {
                is_processed = true;
                break;
            }
        }

        if(is_processed == false)
        {
            //reset variables
            setNAME = "";
            setNum = 0;
            quantity = 0;

            //draw from the next card
            setNAME = iter[i].SET_NAME;
            setNum = iter[i].SET_NUM;
            quantity++;

            //loop to look for similar cards
            for (int x = i+1; x < main_deck_size; x++)
            {
                if (iter2[x].SET_NAME == setNAME && iter2[x].SET_NUM == setNum)
                {
                    quantity++;
                }
            }

            outFile << setNAME << " " << setNum << " " << quantity << "\n";

            if(setNAME == "LOB-EN")
            {
                //removing this line causes the program to work
                processed.push_back(LOB[setNum]);
            }
        }
    }
}

删除我尝试将对象放入双端队列并且程序运行没有错误的行,除了它多次写入相同的卡,我想处理每张卡的数量而不是倍数的文件出现在不同的行。我已经检查了其他问题,这些问题是由于尝试在空双端队列上使用 std::deque::pop_front/back 造成的。但我根本不调用 pop_front/back。

关于什么可能导致错误的任何想法?

【问题讨论】:

  • LOB[setNum] 是卡类型吗?
  • LOB 是一个全局声明的卡片数组。 setNum 是具体卡片对应的数组元素。
  • 当你创建时处理的双端队列是空的,所以处理的双端队列设置为空,即使你将对象放入已处理的双端队列后也保持空。所以在处理的双端队列中至少有一个对象后创建处理的_iter

标签: c++ file-io deque


【解决方案1】:

processed.push_back(LOB[setNum]); 的任何使用都可能使processed_iter 无效。

在循环的第一轮,当processed 开始为空时,或多或少会保证失效。

【讨论】:

  • 哦,我明白了,我想因为我实际上并没有改变 processes_iter 指向的位置,所以它总是指向开始。将其重新指向在每个循环开始时处理的开头解决了该问题。谢谢!我认为这可能是由于 processes.size() 返回了一个奇怪的值,但不知道如何解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多