Ho uno stl::vector<int>
e ho bisogno di rimuovere tutti gli elementi con indici specifici (il vettore di solito ha un'elevata dimensionalità). Mi piacerebbe sapere, che è il modo più efficiente per fare un'operazione del genere avendo in mente che l'ordine del vettore originale dovrebbe essere preservato.Cancellazione di elementi in stl :: vector utilizzando gli indici
Sebbene, ho trovato post correlati su questo problema, alcuni di loro avevano bisogno di rimuovere uno single element o multiple elements dove il remove-erase idiom sembrava essere una buona soluzione. Nel mio caso, tuttavia, ho bisogno di cancellare più elementi e dal momento che sto usando gli indici invece dei valori diretti, non è possibile applicare remove-erase idiom
, giusto? Di seguito il mio codice e vorrei sapere se è possibile fare di meglio in termini di efficienza?
bool find_element(const vector<int> & vMyVect, int nElem){
return (std::find(vMyVect.begin(), vMyVect.end(), nElem)!=vMyVect.end()) ? true : false;
}
void remove_elements(){
srand (time(NULL));
int nSize = 20;
std::vector<int> vMyValues;
for(int i = 0; i < nSize; ++i){
vMyValues.push_back(i);
}
int nRandIdx;
std::vector<int> vMyIndexes;
for(int i = 0; i < 6; ++i){
nRandIdx = rand() % nSize;
vMyIndexes.push_back(nRandIdx);
}
std::vector<int> vMyResult;
for(int i=0; i < (int)vMyValues.size(); i++){
if(!find_element(vMyIndexes,i)){
vMyResult.push_back(vMyValues[i]);
}
}
}
Il problema è che gli indici non saranno più validi dopo che il primo elemento è stato cancellato, lo stesso vale per gli iteratori (puoi ottenere un iteratore da un indice con 'vec.begin() + index'). – Xeo
@Georg, il codice fa quello che dovrebbe. L'idea è di rimuovere l'elemento 'che si trova in una determinata posizione. Nel mio codice, un 'elemento' è rappresentato da' vMyValues' e 'posizione' da' vMyIndexes'. – Peter
Penso di aver avuto lo stesso punto cieco di Andy mentre leggevo ... il tuo codice attuale non viene rimosso sul posto in modo che il problema non ci sia;) –