Je travaille avec un vecteur d'éléments qui doivent être sélectionnés au hasard et effectivement supprimés jusqu'à ce qu'une condition soit remplie, ou jusqu'à ce que tous les éléments aient été sélectionnés. Cependant, ils ne seront pas réellement supprimés avant un certain temps dans l'exécution du code, donc j'ai besoin de maintenir une liste d'éléments valides et disponibles. Je peux effacer des éléments de ce second vecteur, ou je peux le recréer à chaque fois. S'il vous plaît voir une version minimale de mon code ci-dessous montrant l'exemple de l'endroit où le vecteur est créé à chaque fois dans une boucle while:Effacement d'un élément vectoriel C++ par rapport à la création d'un nouveau vecteur
Random mRandom; // Pseudo-random number generator
std::vector< Element* > mElements;
for(unsigned index = 0; index < ARBITRARY_VALUE; index++)
mElements.push_back(new Element());
std::vector<bool> removedElements;
bool condition = true;
while(condition == true) {
std::vector<unsigned> availableIndices;
for(unsigned index = 0; index < mElements.size(); index++) {
if(removedElements[ index ] == false)
availableIndices.push_back(index);
}
if(availableIndices.size() > 0) {
unsigned maximum = availableIndices.size() - 1;
unsigned randomIndex = mRandom.GetUniformInt(maximum); // Zero to max
removedElements[ availableIndices[ randomIndex ] ] = true;
Element* element = mElements[ availableIndices[ randomIndex ] ];
condition = element->DoStuff(); // May change condition and exit while
} else
break;
}
Il est clair que l'effacement d'un élément au milieu d'un vecteur nécessite le système sous-jacent à itérer à travers les éléments restants et les 'déplacer' vers leur nouvelle position valide. Évidemment cela signifie moins d'itérations si les éléments effacés sont proches de la fin d'un vecteur.
J'ai lu quelques articles concernant les coûts associés à l'effacement des éléments vectoriels, mais je n'ai rien vu qui réponde directement à ma question. Est-ce que le processus de «déplacement» des éléments suite à un effacement introduit des frais généraux qui pourraient rendre moins cher l'itération de tous les éléments à chaque fois en créant un nouveau vecteur qui pointe vers les éléments valides? Comme dans mon exemple de code ci-dessus.
Cheers, Phil
On dirait que vous voulez 'std :: stable_partition' pour partitionner les éléments qui seront éventuellement supprimés. – PaulMcKenzie
L'ordre dans 'mElements' est-il important? Sinon, vous pouvez simplement "supprimer" un élément avec 'std :: swap (mElements [randomIndex], mElements [- cur_size]);' (où 'cur_size' est initialisé avec' mElements.size() 'avant le boucle). En d'autres termes, déplacez les éléments "supprimés" jusqu'à la fin, ignorez-les lors d'un traitement ultérieur. Vous pouvez les "effacer" tous à la fois, si vous le souhaitez. –