векторные итераторы несовместимы Vector Line 251

0

Я отлаживаю код, связанный с векторами и итераторами. Я получаю ошибку утверждения, когда я нажимаю кнопку "Создать" в моем графическом интерфейсе. Ошибка утверждения заключается в том, что в заголовке с добавлением /vector Line 251.

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

int VsuCNTreeNodeManager::deleteTreeNode(RWCString & CNNameToDelete, RWTValSlist<VsuDeletedCN> & deletedCNList)
{
    RWCString childName,  parentName;
    VsuCNTreeNode *pNode;
    int i;
    int size;

    if (!nodeList.contains(CNNameToDelete))
        return 1; // Means that CNNameToDelete doest not exist.

    pNode = ordCNList[nodeList[CNNameToDelete]];

    travForName.reset();
    travForName.processElement(pNode);

    const RWTValSlist<RWCString> & childNameList = travForName.getNameList();

    size = childNameList.entries();

    // If it is the Top node that is deleted then
    // the VsuCNTreeNodeManager top node pointer is reset.

    if ( pNode == pTopCNTreeNode )
    {
        pTopCNTreeNode = NULL;
    }

    for ( i = 0; i < size; i++)
    {
        //******* How would it possible to have a name not contained in the nodeList
        //******* since it has been extracted from the nodeList ?????????????

        childName = childNameList.at(i);

        if (nodeList.contains(childName))
        {
            //******* Process that get the Parent List of each deleted Tree Node
            //******* The following code unref all the Tree Nodes that was referencing any deleted Tree Node

            pNode = ordCNList[nodeList[childName]]; // Get the Tree Node to be deleted

            // Fill the deletedCNList
            deletedCNList.insert( VsuDeletedCN(childName, pNode->getCN()->hasType()) );

            VsuDependencyRemoverVisitor visitor( *pNode );

            for (unsigned int k = 0; k < pNode->getParentList().entries(); k++)
            {
                parentName = pNode->getParentList().at(k)->getCN()->getName();

                if ( nodeList.contains(parentName) ) // Check if the parent is not deleted
                {
                    //*** Remove the reference of the deleted tree node from that parent
                    RWBoolean status;
                                        status = ordCNList[nodeList[parentName]]->removeElem(childName); //                           Removing the reference that pNode(parent) had on key(Child)

                }
            }

            //******* Remove references on this object from observers.

            pNode->resetObserverFlags();
            pNode->updateAllObservers(&visitor);

            //******* Process that delete all the Tree Nodes in the parentList

            nodeList.remove(childName);
        }
    }

    //*****************update Lists********************

    size = ordCNList.entries();
    int index = 0;

    RWTValHashDictionary<RWCString, int> tmpNodeList(rwhash);
    //nodeList.clear();

    RWTPtrOrderedVector<VsuCNTreeNode> nodeToDelete(childNameList.entries());

    for(i = 0; i < size; i++)
    {
        pNode = ordCNList[index];
        childName = pNode->getCN()->getName();

        if (!childNameList.contains(childName))
        {
            tmpNodeList.insertKeyAndValue(childName, index);
            index++;
        }
        else
        {
            ordCNList.remove(pNode);
            typeList[pNode->getCN()->hasType()].treeNodeList.remove(pNode);

            // Decrement type counter and if it reach 0 then
            // the entry is removed.
            if( !typeList[pNode->getCN()->hasType()].treeNodeList.entries() )
                typeList.remove(pNode->getCN()->hasType());

            nodeToDelete.insert(pNode);

        }
    }
    nodeList.clear();
    nodeList = tmpNodeList;


    ordCNList.resize(index);

    if (!index)
        pTopCNTreeNode = NULL;

    for( unsigned int j=0; j < nodeToDelete.entries(); j++)
    {
        delete nodeToDelete[j];
    }

    return 0;
}

Теперь строка, в которой есть ошибки:

      RWBoolean status;
      status = ordCNList[nodeList[parentName]]->removeElem(childName);

Определение функции removeElem:

 RWBoolean VsuVE_Collection::removeElem(const RWCString & data)
    {
    VsuVE_Moveable *pMyObj = elementList.at(nameList[data]);

    return removeElem1(pMyObj);
    }

Определение removeElem1:

  RWBoolean  VsuVE_Collection::removeElem1(VsuVE_Moveable *elem)
{
    if (elementList.remove(elem) == FALSE) // THE ASSERTION ERROR HAPPENS RIGHT HERE
        return FALSE;

    //**** Reordering the nameList
    nameList.clear();
    int size = elementList.entries();
    for (int i = 0; i < size; i++)
    {
        nameList.insertKeyAndValue(elementList.at(i)->name, i);
    }

    return TRUE;
}

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

заранее спасибо

  • 0
    Но в заголовке написано «несовместимые векторные итераторы» - что такое сообщение об ошибке actall?
  • 0
    Это сообщение с утверждением: «Выражение: несовместимые векторные итераторы»
Показать ещё 2 комментария
Теги:
iterator
vector
assertions

1 ответ

0
Лучший ответ

Не очевидно, какую конкретную структуру вы используете здесь (Rogue Wave?), Но я думаю, что можно будет вывести проблему.

Ключом к расшифровке этого утверждения является понимание того, что означает несовместимые итераторы. В общем, это означает, что вы пытаетесь выполнить операцию над парой элементов, которые не относятся к одной и той же вещи. Например: (со стандартными библиотечными контейнерами)

std::vector<int> v1, v2;
for (auto it=v1.begin(); it!=v2.end(); it++) {  // <=== iterator incompatible
}

std::vector<int>::iterator it1=v1.begin();
v2.erase(v1); // <==== iterator incompatible

Если вы вникнете в определение типов итераторов, которые у вас есть, то вы должны обнаружить, что при создании итератора он сохраняет ссылку обратно в контейнер, из которого он был создан. Если вы затем выполните операцию на двух итераторах (как в первом случае выше), тогда она может обнаружить, что они относятся к различным контейнерам и, следовательно, несовместимы. Во втором случае у вас есть операция над контейнером и итератором, и поэтому он будет утверждать, что итератор ссылается на этот контейнер.

В вашем случае кажется, что вы пытаетесь удалить элемент из контейнера. Структура утверждает, что элемент не находится в контейнере (а на самом деле, вероятно, в другом). Я подозреваю, что вы удаляете элемент из неправильного контейнера.

  • 0
    Прежде всего большое спасибо за ваш ответ. Я фактически начал смотреть на различные итераторы, которые у меня есть, и которые я на самом деле использую. Немного покопавшись, я смогу найти, какие два сталкиваются. Хотя я думаю, что ваш пост заставил меня понять, что у меня есть кое-какие исследования по поводу итераторов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню