Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11734
Последний выпуск: 19.06.2015

Ошибка сравнения итераторов

6
24 июля 2015 года
@pixo $oft
3.4K / / 20.09.2006
Есть рекурсивная функция поиска итератора в дереве векторов.
Код:
vector<DataBlock>::iterator SearchSubtree(HTREEITEM hti,vector<DataBlock> *vDB,vector<DataBlock> **pvParent){
    for(vector<DataBlock>::iterator it=vDB->begin();it!=vDB->end();++it){
        if(it->hTI==hti){
            if(pvParent)
                *pvParent=vDB;
            return it;
        }else if(!it->bFile){
            vector<DataBlock>::iterator Tmp=SearchSubtree(hti,&it->SubBlock,pvParent);
            if(Tmp!=it->SubBlock.end()){
                if(pvParent&&!*pvParent)    //Если указатель передан в качестве параметра и не указывает на что-то
                    *pvParent=&it->SubBlock;
                return Tmp;
            }
        }
    }
    return vDB->end();  //Если элемент не найден на текущем уровне,возвращаем end() уровня как сигнал о неуспешности поиска
}
Она нужна для того, чтобы можно было найти нужный элемент в дереве и удалить его (а в векторах, как и во многих других контейнерах, это можно сделать только с помощью итератора, да и к элементам обращаться удобнее). Для этой цели возвращается указатель на контейнер, в котором был найден итератор соответствующего элемента, т.к. без контейнера, по одному лишь итератору, удалить элемент мы не сможем, а как искать по итератору родительский контейнер, мне пока неизвестно.
При вложенности больше 2 я получаю ошибку "vector iterators incompatible". В чём её суть, я примерно понимаю, но как мне избавиться от неё, сохранив структуру функции?

Вот код кнопки удаления.
Код:
case BtnDel:{
    HTREEITEM htiDel=CurElt.hTI;bool bFound=false;
    for(vector<Package>::iterator itP=Packages.begin();itP!=Packages.end();++itP){
        if(itP->hTI==htiDel){
            Packages.erase(itP);
            break;
        }else{
            for(vector<RootDir>::iterator itR=itP->RootDirs.begin();itR!=itP->RootDirs.end();++itR){
                if(itR->hTI==htiDel){
                    itP->RootDirs.erase(itR);
                    bFound=true;
                }else{
                    vector<DataBlock> *pvDB=0;
                    vector<DataBlock>::iterator itD=SearchSubtree(htiDel,&itR->DataBlocks,&pvDB);
                    if(pvDB){
                        pvDB->erase(itD);
                        bFound=true;
                    }
                }
                if(bFound)
                    break;
            }
        }
    }
    SendDlgItemMessage(hDlg,TVwLocs,TVM_DELETEITEM,0,(LPARAM)htiDel);
}
Описание типов данных и переменных.
Код:
struct DataBlock{
    HTREEITEM hTI;
    string szName;
    bool bFile;
    vector<DataBlock> SubBlock;
};
struct RootDir{
    HTREEITEM hTI;
    string szRootDir;
    vector<DataBlock> DataBlocks;
};
struct Package{
    HTREEITEM hTI;
    string szName;
    vector<RootDir> RootDirs;
};
enum AddType{
    Pkg,Root,Dir,File
};
struct CurrentElement{
    void *pElt;
    HTREEITEM hTI;
    AddType EltType;
};

vector<Package> Packages;CurrentElement CurElt;
Я уже не знаю, как можно сравнить возвращённый итератор с концом списка (это условие, показывающее, что в текущей ветке дерева элемент с искомым hti не был найден). Какие ещё есть идеи?

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог