Si supponga di avere una classe "Widget". Nella mia applicazione, creo molti widget che (per località cache e altri motivi) mantengo un vettore.Tipo di dati per la tabella di ricerca/indice nell'array
Per ricerche efficienti vorrei implementare un indice di dati. Per il gusto della domanda, supponiamo che sia una semplice tabella di ricerca dagli indici int agli elementi Widget nel vettore sopra menzionato. La mia domanda è: quale dovrebbe essere il contenuto della tabella di ricerca. In altre parole, con quale tipo dovrei sostituire il punto interrogativo in
using LookupTable = std::vector<?>
vedo le seguenti opzioni:
- Riferimenti (Widget &, o meglio come deve essere assegnabili: reference_wrapper <widget>)
- puntatori (widget *)
- indici nel vettore widget (size_t)
- oggetti iteratore che punta nel vettore Widget (std :: vector <Widget> :: iterator)
Tra queste opzioni, indici sembrano essere l'unica opzione che non vengono invalidato da un ridimensionamento vettoriale. Potrei essere in grado di evitare le ridimensionazioni, tuttavia, implementare la tabella di ricerca in questo modo significa fare supposizioni sull'implementazione del vettore che sembra irragionevole da un punto di vista del "design disaccoppiato".
Gli indici OTOH non sono typesafe: se la cosa che ottengo dalla tabella di ricerca era un riferimento, potevo utilizzarla solo per accedere al widget corrispondente. L'utilizzo di valori size_t posso fare operazioni senza senso come moltiplicando il risultato per 3. Considera anche i seguenti due firme:
void doSomethingWithLookupResult(Widget& lookupResult);
void doSomethingWithLookupResult(size_t lookupResult);
Il primo è molto più descrittivo.
In breve: quale tipo di dati posso utilizzare per la mia tabella di ricerca per ottenere sia un disaccoppiamento dall'implementazione del vettore che la sicurezza del tipo?
Puoi fornire un esempio per * come * stai effettivamente utilizzando il LookupTable? – Barry
@Barry: la tabella std :: vector > è una semplificazione. Tuttavia, diciamo che il widget ha un valore prioritario. Quindi, nella mia tabella di ricerca, desidero trovare rapidamente il primo Widget dall'elenco originale con la priorità specificata. Questo sarebbe letteralmente una ricerca vettoriale: widgetByPriority [priorità]. Dopodiché, ovviamente voglio lavorare con il widget che ho trovato, ad es. calcolare la sua dimensione. – DanielM