2016-02-18 1 views
0

Existe-t-il un moyen simple d'ajouter un vecteur dans un autre vecteur, et de supprimer l'itérateur à la position d'insertion après (pratiquement itérateur "avec un nouveau vecteur)? Ce que je veux faire est (lire un commentaire dans le code):Insérer un vecteur C++ en "remplaçant" l'itérateur au point d'insertion (avec une complication)

struct Data 
{ 
    Data(int i) :d(i) {} 
    vector<Data> vec; 
    int d; 
}; 
vector<Data> dataVector = { Data(1), Data(2), Data(3) }; 
dataVector[1].vec = { Data(41), Data(42) }; 

// Task: replace Data(2) in dataVector with dataVector[1].vec to get {Data(1),Data(41),Data(42),Data(3)}; 

for (auto it = dataVector.begin(); it != dataVector.end();) { 
    if ((*it).d == 2) { 
     it = dataVector.insert(it,(*it).vec.begin(),(*it).vec.end()); 
     // Now delete Data(2) somehow 
     // it = dataVector.erase(... 
    } 
    else it++; 
} 

est là une façon élégante d'y parvenir sans incrémenter « it » n fois ou en utilisant des variables supplémentaires? En général, j'aurais des vecteurs de longueur arbitraire, et je préférerais ajouter le nouveau vecteur à la fin, mais ce n'est pas crucial.

+0

Avez-vous essayé 'dataVector.insert (it, it-> vec.begin(), it-> vec.end()); it = dataVector.erase (it); '? – txtechhelp

+0

Oui, mais l'itérateur est invalide après 'dataVector.insert (it, it-> vec.begin(), it-> vec.end())', donc vous devez obtenir le nouveau en obtenant la valeur de retour de insérer. Le problème est, que la valeur de retour est toujours un itérateur au début des données insérées – Camleon

+0

Je viens de trouver une solution: 'it = dataVector.insert (it + 1, it-> vec.begin(), it-> vec .fin()); It = dataVector.erase (it-1); 'peut-être que ce n'est pas le meilleur, mais il semble fonctionner – Camleon

Répondre

0

Je viens de trouver une solution: it = dataVector.insert(it+1,it->vec.begin(),it->vec.end()); it = dataVector.erase(it-1); Peut-être que ce n'est pas le meilleur, mais il semble fonctionner même pour insertinf au début/fin du vecteur. Merci de votre aide!