Je me remets à utiliser le C++ et j'essaie de convertir un simple programme Java que j'ai écrit récemment.
Quel est l'équivalent préféré de l'ArrayList de Java en C++ ?
Je me remets à utiliser le C++ et j'essaie de convertir un simple programme Java que j'ai écrit récemment.
Quel est l'équivalent préféré de l'ArrayList de Java en C++ ?
Utilisez le std::vector
classe de la bibliothèque standard.
Hmmm ... d'après l'autre réponse, il semble que le vecteur ne soit pas implémenté comme une liste chaînée ? N'ai-je pas raison ? J'utilise cette liste comme une collection qui aura une rotation assez élevée d'objets ajoutés et retirés. Ce tableau est-il réellement la meilleure implémentation ? Ou existe-t-il une version en liste chaînée ?
@interstar - tout à fait correct. Si vous voulez vraiment la sémantique des listes liées, utilisez alors std::list
mais vous perdez alors l'indexabilité (pas d'indexation). operator[]
) donc ce n'est pas vraiment un tableau. list
qui a ses propres particularités telles que vector
est souvent un meilleur choix. Dans les conteneurs C++ standard, vous allez devoir faire des compromis d'une manière ou d'une autre. Regardez deque
qui pourrait vous offrir une meilleure perforation. Il est (relativement) facile de mesurer vector
vs deque
vs list
car ils sont largement interchangeables dans le code - utilisez simplement un typedef pour votre conteneur, par ex. typedef vector<MyObj> MyList
.
Je vais d'abord essayer le vecteur. Parce que l'index est utile. Si c'est trop lent, je passerai peut-être à la liste chaînée. Merci
Quelques points supplémentaires concernant l'utilisation de vector
ici.
Contrairement à ArrayList
y Array
en Java, il n'est pas nécessaire de faire quoi que ce soit de spécial pour traiter un fichier de type vector
comme un tableau - le stockage sous-jacent en C++ est garanti comme étant contigu et efficacement indexable.
Contrairement à ArrayList
, a vector
peut contenir efficacement des types primitifs sans être encapsulé comme un objet à part entière.
Lorsque vous retirez des éléments d'un vector
Si vous ne voulez pas que les éléments situés au-dessus de l'élément retiré soient déplacés vers le bas afin de préserver la contiguïté du stockage. Cela peut s'avérer coûteux pour les grands conteneurs.
Assurez-vous que si vous stockez des objets complexes dans le vector
que leur constructeur de copie et leurs opérateurs d'affectation sont efficaces. Sous la couverture, la STL C++ les utilise pendant le nettoyage des conteneurs.
Conseils sur reserve()
L'utilisation de la mémoire en amont (c'est-à-dire au moment de la construction du vecteur ou de l'initialisation) pour minimiser la réaffectation de la mémoire lors d'extensions ultérieures est transférée de Java à C++.
Comme d'autres réponses, la plus proche est std::vector
.
Mais il y a une chose importante à prendre en compte, la complexité de l'espace.
Le vecteur C++ a un calcul dépendant du compilateur lorsque la capacité actuelle est pleine. Lorsque la capacité est pleine, certains compilateurs augmentent la capacité du vecteur de manière exponentielle et d'autres de manière moins exponentielle.
Pour les tableaux Java, il n'y a pas de détails exacts spécifiés par les normes pour recalculer la capacité lorsqu'elle est pleine. Certains ont un calcul approximatif de 150% plus un. Mais je ne suis pas sûr que ce soit le calcul exact.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
stackoverflow.com/questions/14426338/java-arraylist-in-c