struktura powłoki bash

0

Muszę połączyć kilkadziesiąt poleceń które mają być wykonywane w konsoli na wzór basha w sensie że nazwa polecenia, opcje i wszystkie parametry mają być podawane w 1 linii np find C:\ szukany_plik. I teraz jak to widzę - wczytuje komendę do stringa, sprawdzam odpowiednia maską ( boost::regex ), wyciągam ze stringa 1 człon który jest nazwą polecenia, dalej przeszukuje std::vector w którym przechowuje wszystkie polecenia( vector dlatego że oferuje najszybsze wyszukiwanie ) i teraz chciałbym wywołać odpowiednią metodę przekazując jej pozostałe parametry jak w tym przypadku połączyć odpowiednią metodę z nazwą plecenia? przechowywać w vectorze std::pair a w nim nazwę polecenia i wskaźnik na metodę? czy jest lepszy sposób? Prosiłbym o jakieś nakierowanie czy sposób w jaki chce to wykonać jest prawidłowy

1

http://www.cplusplus.com/reference/unordered_map/unordered_map/
http://en.cppreference.com/w/cpp/utility/functional/mem_fn

Polecalbym taka kombinacje. Ew. mem_fn mozesz zastapic jakims wzorcem Command.

1

przeszukuje std::vector w którym przechowuje wszystkie polecenia( vector dlatego że oferuje najszybsze wyszukiwanie )

mam nadzieję że żartujesz albo miałeś na myśli std::set albo std::unordered_set...
vector przeszukasz w O(n), set w O(logn) a unordered_set w O(1)...
Wiązanie nazwy z funkcją zrób za pomocą mapy, tak jak napisano wyżej.

0

"Dostęp do poszczególnych elementów w std::vector jest szybki - odbywa się w czasie stałym 0(1), w kontenerze set w czasie logarytmicznym 0(log(N)) czyli wolniej niż w vectorze..." I żeby nie było że się kłócę ! ;) Raczej słucham tego co mówią starsi stażem koledzy ;) ale w tym wypadku to co mówicie jest sprzeczne z tym co mówi dokumentacja...

edit ::
rozumiem - jeżeli znam miejsce gdzie znajduje się szukany element to szybszy jest vector ale mylące jest to "Dostęp / wydajność szukania" ;)

3

Panie, to ty po prostu nie rozumiesz co czytasz. DOSTĘP to znaczy odwołanie się wektor[1] albo wektor[10]. Tak jak w zwykłej tablicy wykonujesz to w czasie stałym. Ale WYSZUKANIE czegoś w tablicy to jest zupełnie co innego! Żeby sprawdzić czy element znajduje się w tablicy/wektorze musisz przelecieć każdy jej element czyli wykonać O(n) operacji. W zbiorze opartym o drzewo wystarczy O(logn) operacji a w zbiorze opartym o tablicę hashującą O(1). Gdybyś miał posortowany wektor/tablicę to mógłbyś to też zrobić w czasie O(logn) za pomocą szukania połówkowego, ale wstawianie byłoby wtedy bardziej kosztowne.

A potem słucha sie marudzenia studentów "a po co mam się uczyć o tych algorytmach i strukturach danych skoro to już wszystko jest zaimplementowane", a tu sie okazuje że nie dość że ktoś nie wie jak to jest zaimplementowane to jeszcze nie potrafi używać...

1 użytkowników online, w tym zalogowanych: 0, gości: 1