Ошибка сравнения итераторов
Код:
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() уровня как сигнал о неуспешности поиска
}
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);
}
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;
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;