Jakiś czas temu robiłem projekt typowy z I semestru. Miałem w nim funkcję DaysToNumbers
, która niezbyt kulturalnie wyglądała. Ale porobiłem testy, wykonanie się funkcji zajmowało ułamek procenta całości wykonania się programu i tak już to zostało.
Tylko, że teraz mnie to trochę gryzie, bo nadal nie wiem jak to zrobić żeby było jak najlepiej. Proszę o feedback, już upraszczając tłumaczę o co chodzi.
Mam listę jednokierunkową:
struct Node {
std::string day; // only these 7 values: "Mon", "Tue", ..., "Sun" are accepted, rest is treated as exception
...
Node *pNext;
};
A o to funkcja DaysToNumbers
wraz z 'funkcją-matką' ReplaceDaysToNumbers
:
/** Function replaces literal day of the week's name with its corresponding number, i.e.: Mon->1, Tue->2, etc. */
void DaysToNumbers(Node*& p)
{
if (p->day == "Mon")
p->day = "1";
else if (p->day == "Tue")
p->day = "2";
else if (p->day == "Wed")
p->day = "3";
else if (p->day == "Thu")
p->day = "4";
else if (p->day == "Fri")
p->day = "5";
else if (p->day == "Sat")
p->day = "6";
else if (p->day == "Sun")
p->day = "7";
}
/** Function iterates through SLL and replaces every node's day of the week by using DaysToNumbers within the function. */
void ReplaceDaysToNumbers(Node*& pHeadNode)
{
std::cout << "Replacing days with numbers (e.g.: Mon -> 1)..." << std::endl;
Node* p = pHeadNode;
while (p) {
DaysToNumbers(p);
p = p->pNext;
}
}
Chodzi o to, że mam wypełnioną listę danymi i chcę pole struktury "days" zamienić na odpowiednik liczbowy.
Nie mogę korzystać z żadnego STLowskiego containera typu map
lub vector
, ale dozwolone są statyczne tablice. Można implementować swoje odpowiedniki STLowskich containerów.
Myślałem nad mniej więcej czymś takim (pseudokod):
std::string days_db[7] = {"Mon", "Tue", ..., "Sun"};
for (int i = 0; i < 7; i++)
if (p->day == days_db[i]) {
p->day = days_db[i];
break/return;
}
ale czy to nie jest po prostu gorsze rozwiązanie, bo w końcu trzeba by zaalokować dodatkową pamięć dla arraya, a sama pętla pomijając już alokację i
też za pewne coś kosztuje. Jest więc wolniej (nie testowałem) i zajmuje więcej pamięci, więc gorzej. Za to jest czytelniej. (czy aby na pewno? Dla osobo wystarczająco mocno początkującej pierwotny kod byłby czytelniejszy)
Jeszcze jest kwestia co gdyby dni było sto czy tysiąc, to czy bym robił sto ifów? Nie wiem, ale nawet gdybym korzystał z tego drugiego rozwiązania, to i tak musiałbym wpisać te tysiąc dni do tablicy, więc prawie równie dobrze można by ifami jechać.
Chyba można by samemu zaimplementować własną strukturę imitującą std::unordered_map
czy coś podobnego, ale czy to nie za duża artyleria na ten problem? (i nie wiem czy złożonościowo i czytelnościowo aby na pewno byłoby lepiej)
Po prostu nie podoba mi się idea, że nawet podoba mi się to rozwiązanie u góry. Ma ktoś jakąś propozycję alternatywnego rozwiązania? Kiedy ważniejsza jest optymalizacja od czytelności kodu i vice versa?