02. Remove Invalid Companies
Здравейте!
Срещнах няколко проблема с втора задача от домащното:
- Имаме list, за чиито елементи се заделя памет динамично. При триенето, след като изтрия с delete въпросния елемент, го махам от листа с remove. Не знам дали това е правилно, но ако използвам само delete, елементът не се махаше от листа и после се омацваше при изписването на компаниите в main-a.
- След като го изтрия, както съм посочил в т. 1, нещо се объркваше с итерирането на листа - предполагам, че е, защото в листа всеки елемент носи информация за адреса на предходния и следващия... Това го разреших, като не трия директно щом видя елемент с невалидно айди, а просто събирам итераторите към тези елементи в един вектор и после обикалям вектора и ги трия от листа.
След като направих тези 2 неща (моля някой да ме коригира, ако не ги правя правилно), програмата си ми работеше, но явно е твърде бавна, защото ми дава 50/100 (time limit). Хрумна ми да направя iterator-a static, за да не обикалям всеки път елементите, които вече съм проверил, но и това не ми подобри performance-a. Ще съм много благодарен, ако някой отдели време да ми съдейства! Ето го кода ми:
#ifndef REMOVE_INVALID_H
#define REMOVE_INVALID_H
#include "Company.h"
#include <list>
#include <vector>
using namespace std;
void removeInvalid(list <Company*>& allCompanies)
{
vector <list <Company*>::iterator> allInvalidIds; // store iterators to all elements with invalid IDs
list <Company*>::iterator it = allCompanies.begin();
for (it; it != allCompanies.end(); ++it)
{
if ((*it)->getId() < 0)
{
allInvalidIds.push_back(it);
}
}
for (size_t i = 0; i < allInvalidIds.size(); ++i)
{
delete (*allInvalidIds[i]); //deallocate the memory
allCompanies.remove(*allInvalidIds[i]); //delete the element from the list
}
}
#endif // !REMOVE_INVALID_H