Question

Effectuez l'une des bibliothèques C ++ populaire ont une classe (ou classes) qui permettent au développeur d'utiliser des tableaux avec des indices arbitraires sans sacrifier la vitesse?

Pour donner à cette question une forme plus concrète, je voudrais la possibilité d'écrire un code similaire à ce qui suit:

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

La solution

Vraiment, vous devez utiliser un vecteur avec un décalage. Ou même un tableau avec un décalage. L'addition supplémentaire ou la soustraction ne va pas faire de différence à la vitesse d'exécution du programme.

Si vous voulez quelque chose avec exactement la même vitesse comme un tableau par défaut C, vous pouvez appliquer le décalage au pointeur de tableau:

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

Cependant, il est déconseillé. Si vous voulez vraiment faire, vous devez créer une classe wrapper avec des fonctions en ligne qui se cache le code horrible. Vous maintenez la vitesse du code C, mais finissent avec la possibilité d'ajouter un contrôle d'erreur.

Comme mentionné dans les commentaires, après avoir modifié le pointeur de tableau, vous ne pouvez pas supprimer à l'aide alors que le pointeur. Vous devez réinitialiser le début réel du tableau. L'alternative est que vous gardez toujours le pointeur vers le début mais le travail avec un autre pointeur modifié.

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

Autres conseils

A std::vector<int> ferait l'affaire ici.
Acess aléatoire à un seul élément dans un vecteur est seulement O (1).

Si vous avez vraiment besoin d'indices personnalisés que vous pouvez faire votre propre petite classe basée sur un vecteur d'appliquer une ofset.

Utilisez la classe carte de la STL:

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

carte est mis en œuvre en interne comme un conteneur Sorted, qui utilise une recherche binaire pour localiser des éléments.

[Ceci est un vieux fil, mais pour l'amour de référence ...]

Boost.MultiArray a un système d'extensions pour le réglage toute plage d'index.

Les tableaux dans la bibliothèque ObjexxFCL ont un support complet pour les plages d'index arbitraires.

Ce sont les deux bibliothèques de tableaux multidimensionnels. Pour le tableau OP 1D a besoin de la std :: enveloppe de vecteur ci-dessus devrait suffire.

Réponse modifiée parce que je ne suis pas très intelligent.

Enveloppez un std::vector et un décalage dans une classe et de fournir 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] }
};

Je ne sais pas si cela compile, mais vous voyez l'idée.

Ne pas tirer de std::vector bien, voir les commentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top