Załóżmy, że mam klasę "Widget". W mojej aplikacji tworzę dużo widżetów, które (dla lokalizacji pamięci podręcznej i innych powodów) trzymam w wektorze.Typ danych dla tabeli/indeksu odnośników do tablicy
Dla skutecznych wyszukiwań chciałbym wdrożyć bazę danych indeksu. Dla samego pytania załóżmy, że jest to prosta tablica przeglądowa od wskaźników int do elementów Widget we wspomnianym wektorze. Moje pytanie brzmi: Jaka powinna być zawartość tabeli odnośników. Innymi słowy, z jakiego typu należy wymienić znak zapytania w
using LookupTable = std::vector<?>
widzę następujące opcje:
- Referencje (Widget &, czy raczej, jak to ma być przypisane: reference_wrapper <widget>)
- Wskaźniki (widget *)
- Indeksy w wektorze widżet (size_t)
- obiekty iterator wskazujący do wektora Widget (std :: vector <Widget> :: iterator)
Wśród tych opcji, wskaźniki wydają się być jedyną opcją, która nie dostać podważa zmiany rozmiaru wektorowych. Możliwe, że będę w stanie uniknąć zmiany rozmiaru, jednak implementacja tablicy odnośników będzie oznaczać przyjęcie założeń dotyczących implementacji wektorowej, która wydaje się nierozsądna z punktu widzenia "oddzielenia projektu".
Wskaźniki OTOH nie są zabezpieczone przed niebezpieczeństwem: jeśli rzecz, którą wydostaję z tabeli odnośników, była referencją, mogłem jej użyć tylko do uzyskania dostępu do odpowiedniego widżetu. Użycie wartości size_t mogę zrobić operacje bezsensowne jak mnożąc wynik przez 3. Weź również pod uwagę następujące dwa podpisy:
void doSomethingWithLookupResult(Widget& lookupResult);
void doSomethingWithLookupResult(size_t lookupResult);
ta pierwsza jest znacznie bardziej opisowe.
Podsumowując: Jakiego rodzaju danych można użyć do mojej tabeli odnośników, aby uzyskać zarówno oddzielenie od implementacji wektorowej, jak i bezpieczeństwo typu?
Czy możesz podać przykład * sposobu * używania tabeli LookupTable? – Barry
@ Barry: Tabela std :: vector > jest uproszczeniem. Niemniej jednak powiedz, że widget ma wartość priorytetu. Następnie w tabeli wyszukiwania chcę szybko znaleźć pierwszy widżet z pierwotnej listy o podanym priorytecie. Byłoby to dosłownie odnośnikiem do wektora: widgetByPriority [priority]. Potem oczywiście chcę pracować z widżetem, który znalazłem, np. obliczyć jego rozmiar. – DanielM