void CVTExtIndex::RemoveRowFromTree(int row_num, int delta) { if( !IsIndexed() ) return; CVTExtIndexTreeNode *node_to_delete = NULL; CVTExtIndexTreeNode *node = Min(Root); while( node ) { if( node->ArrayEqualIDs && !node->ArrayEqualIDs->empty() ) { vector &Vector = *(node->ArrayEqualIDs); bool vector_erased = false; if( node->ID == row_num ) { //Ключ ссылается на удаляемую строку, поэтому в качестве ключа нужно взять какую-то другую строку. //Возьмём последнюю строку из списка дублей. node->ID = Vector.back(); node->Key.Row = pVT->GetRow(node->ID); Vector.pop_back(); vector_erased = true; node->Count--; Count--; } if( node->ID > row_num ) { node->ID += delta; } vector::iterator Iterator = Vector.begin(); while( Iterator != Vector.end() ) { if( *Iterator == row_num ) { Iterator = Vector.erase(Iterator); //Удаляемая строка оказалась в списке дублей. Уберём её оттуда. vector_erased = true; node->Count--; Count--; } else { if( *Iterator > row_num ) { *Iterator += delta; } Iterator++; } } if( vector_erased ) { if( Vector.empty() ) { delete node->ArrayEqualIDs; node->ArrayEqualIDs = NULL; UniqueCount++; } if( delta == 0 ) break; //если строка удаляется только из индекса, то дальше перебирать узлы смысла нет } } else if( node->ID == row_num ) { node_to_delete = node; if( delta == 0 ) break; //если строка удаляется только из индекса, то дальше перебирать узлы смысла нет } else if( node->ID > row_num ) { node->ID += delta; } node = Successor(node); } if( node_to_delete ) Delete(node_to_delete); }