Здравствуйте, TTL, Вы писали:
TTL>Есть следующие классы:
TTL>class Base{}; — абстрактный базовый класс
TTL>class Child1:public Base{};
TTL>class Child2:public Base{};
TTL>и три вектора:
TTL>std::vector<Child1*> Ch1Vec;
TTL>std::vector<Child2*> Ch2Vec;
TTL>std::vector<Base*> BsVec; //содержит элементы из Сh1Vec и Ch2Vec
TTL>Где-то в программе:
TTL>TTL>std::vector <Child1*> :: iterator Ch1Itr;
TTL>std::vector <Base*> :: iterator BsItr;
TTL>Ch1Itr = Ch1Vec.begin();
TTL>BsItr = BsVec.begin();
TTL>while (dynamic_cast<Child1*>(*BsItr) != *Ch1Itr)
TTL> ++BsItr;
TTL>Base *delptr = *BsItr;
TTL>delete delptr;
TTL>BsVec.erase(BsItr);
TTL>Ch1Vec.erase(Ch1Itr);
TTL>
TTL>Т.е. имея итератор Ch1Itr я удалил записи на объект Child1 из векторов BsVec и Ch1Vec.
TTL>Тоже самое могу сделать, если имею итератор Сh2Itr.
TTL>А вот как обратную процедуру, т.е. имея итератор BsItr удалить записи из BsVec и одного из
TTL>векторов, хранящего указатели на потомков?
TTL>Вообще-то как удалить понятно, как наиболее быстро определить из какого вектора потомков
TTL>надо удалять? Неужели придется делать проход по всем векторам потомков, пока не встречу
TTL>искомый элемент?
ИМХО крайне неудачная реализация — использование dynamic_cast совершенно излишне:
std::vector <Child1*> :: iterator Ch1Itr;
std::vector <Base*> :: iterator BsItr;
Ch1Itr = Ch1Vec.begin();
BsItr = std::find(BsVec.begin(), BsVec.end(), *Ch1Itr);
Обратная процедура практически ничем не отличается (за исключением того, что здесь использование dynamic_cast оправдано):
std::vector <Base*> :: iterator BsItr = BsVec.begin();
Child1* p1 = dynamic_cast<Child1*>(*BsItr);
if(p1)
{
std::vector <Child1*> :: iterator Ch1Itr = std::find(Ch1Vec.begin(), Ch1Vec.end(), p1);
...
}
else
{
std::vector <Child2*> :: iterator Ch2Itr = std::find(Ch2Vec.begin(), Ch2Vec.end(), static_cast<Child2*>(*BsItr));
...
}
ЗЫ
Почему используется std::vector, а не тот же std::set?