Итератор Deque не разыменовывается

Итак, я пытался вводить и выводить файлы, чтобы сохранить колоды Yugioh, и у меня это в основном работало. Я использую deques для хранения объекта класса, известного как Card, который содержит всю информацию, и класса Deck для хранения deques для объектов Card для каждого типа колоды, основной, боковой и дополнительной.

Так или иначе, к проблеме. Я использую локальную двухстороннюю очередь для хранения информации о ранее загруженных картах, так как при загрузке каждой карты я ищу в двухсторонней очереди точные совпадения, а затем сохраняю номер внутри переменной для использования при выводе. Когда я пытаюсь добавить в эту локальную двухстороннюю очередь, называемую «обработанной», я получаю сообщение об ошибке.

Ошибка отладки! Выражение: 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.

Есть идеи, что могло вызвать ошибку?


person L.Moyer    schedule 21.01.2017    source источник
comment
Является ли LOB [setNum] типом карты?   -  person Syed Ahmed Jamil    schedule 22.01.2017
comment
LOB - это массив карт, объявленных глобально. setNum - это элемент массива, соответствующий конкретной карте.   -  person L.Moyer    schedule 22.01.2017
comment
Когда вы создавали processing_iter, в это время обработанная двухсторонняя очередь была пустой, поэтому для processing_iter было установлено значение null и оставалось нулевым даже после того, как вы поместили объекты в обработанную двухстороннюю очередь. Итак, создайте обработанный_iter после того, как в обработанной двухсторонней очереди будет хотя бы один объект   -  person Syed Ahmed Jamil    schedule 22.01.2017


Ответы (1)


Любое использование processed.push_back(LOB[setNum]); может сделать processed_iter недействительным.

В первом раунде цикла, когда processed начинается с нуля, аннулирование более или менее гарантировано.

person Bo Persson    schedule 21.01.2017
comment
Понятно, подумал я, поскольку на самом деле не менял место, куда указывал processing_iter, он всегда будет указывать на начало. Переназначение его на начало обработки в начале каждого прохода цикла решило проблему. Спасибо! Я подумал, что это могло быть что-то из-за того, что process.size () возвращает странное значение, но не знал, как это исправить. - person L.Moyer; 22.01.2017