Domanda

Eseguire una delle C ++ popolare biblioteche hanno una classe (o le classi) che permettono agli sviluppatori di utilizzare array con indici arbitrari senza sacrificare la velocità?

Per dare a questa domanda forma più concreta, vorrei che la possibilità di scrivere codice simile al di sotto:

//An array with indices in [-5,6)
ArbitraryIndicesArray<int> a = ArbitraryIndicesArray<int>(-5,6);  
for(int index = -5;index < 6;++index)
{
    a[index] = index;
}
È stato utile?

Soluzione

In realtà si dovrebbe utilizzare un vettore con un offset. O anche un array con un offset. L'aggiunta extra o sottrazione non ha intenzione di fare alcuna differenza per la velocità di esecuzione del programma.

Se si desidera qualcosa con esattamente la stessa velocità di un array predefinito C, è possibile applicare l'offset al puntatore:

int* a = new int[10];
a = a + 5;
a[-1] = 1;

Tuttavia, non è consigliabile. Se si vuole veramente fare che è necessario creare una classe wrapper con funzioni inline che nasconde il codice orribile. Si mantiene la velocità del codice C, ma finisce con la possibilità di aggiungere ulteriore controllo degli errori.

Come già detto nei commenti, dopo aver modificato il puntatore, non è possibile eliminare utilizzando tale puntatore. È necessario ripristinare l'inizio effettivo della matrice. L'alternativa è di tenere sempre il puntatore all'inizio, ma lavoro con un altro puntatore modificato.

//resetting the array by adding the offset (of -5)
delete [] (a - 5);

Altri suggerimenti

Un std::vector<int> farebbe il trucco qui.
acess casuale di un singolo elemento di un vettore è solo O (1).

Se si ha realmente bisogno gli indici personalizzati è possibile rendere il proprio piccolo di classe sulla base di un vettore per applicare un ofset.

Utilizzare la classe mappa dal STL:

std::map<int, int> a;
for( int index = -5; index < 6; ++index )
{ 
    a[index] = index; 
}

mappa viene implementato internamente come un contenitore ordinato, che utilizza una ricerca binaria per individuare gli elementi.

[Questo è un vecchio thread, ma per l'amor di riferimento ...]

Boost.MultiArray ha un sistema di estensioni per l'impostazione qualsiasi intervallo di indice.

Gli array della ObjexxFCL biblioteca hanno supporto completo per intervalli di indice arbitrari.

Si tratta di due librerie di array multidimensionali. Per l'array OP 1D bisogno std :: involucro vettore sopra dovrebbe essere sufficiente.

Risposta modificato perché non sono molto intelligente.

Avvolgere un std::vector e un offset in una classe e di fornire un operator[]:

template <class T>
class ArbVector
{
    private:
        int _offset;
        std::vector<T> container;
    public:
        ArbVector(int offset) : _offset(offset) {}
        T& operator[](int n) { return container[n + _offset] }
};

Non sono sicuro se questo viene compilato, ma si ottiene l'idea.

non derivano da std::vector però, vedere i commenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top