2016-11-02 3 views
0

J'ai un problème plutôt intéressant (intéressant pour moi quand même, étant débutant et tout): En C++ on peut plutôt facilement développer un vecteur avec push_back(), qu'on peut simplement mettre en boucle pour grandir autant que nécessaire . Le problème est, que je n'ai trouvé aucune fonctionnalité facile similaire pour réduire sa taille. Ce que je veux vraiment faire, c'est d'avoir un vecteur avec une taille prédéfinie, et puis disons de supprimer entièrement la seconde moitié (pas seulement les éléments contenus, mais la taille du vecteur devrait aussi être réduite). Un exemple:Comment supprimer une gamme d'éléments d'un vecteur en changeant sa taille (C++)?

vector<int> numrange; 
for (int i=0; i<=100; ++i) {numrange.push_back(i);} 

Cela fonctionne parfaitement pour la croissance du vecteur et son remplissage avec un nombre. Mais cela ne semble pas être autorisé:

int vectsize=numrange.size(); 
for (int i=vectsize; i>=(vectsize/2); --i) {numrange.erase(i);} 

Vous voyez, je veux effacer tous les éléments ci-dessus 50, mais cela ne fonctionnera pas. Quelque chose à faire avec "aucune conversion connue de int à const itérateur"

Merci pour l'aide.

+0

On dirait que vous pourriez avoir besoin l'idiome de suppression d'effacement – NathanOliver

+0

'de numrange.resize (numrange.size()/2); 'redimensionnera' numsize' pour ne contenir que les premiers éléments 'numrange.size()/2', détruisant la dernière moitié des éléments du vecteur. – jaggedSpire

+0

Quand vous dites "la taille du vecteur devrait également être réduite", voulez-vous dire "réduire la valeur retournée par' size' ", ou voulez-vous dire" réduire la valeur retournée par 'size' et' capacity' "? Ce dernier est plus dur (c'était presque impossible en C++ 98, je pense qu'il y a des mécanismes dans les versions plus récentes). –

Répondre

2

std::vector<> La fonction membre erase() prend un itérateur de type std::vector<>::const_iterator. Vous fournissez un int à la fonction, de sorte que l'appel ne peut pas être effectué car int ne se convertit pas implicitement en std::vector<>::const_iterator.

Vous devez compenser un itérateur de la manière suivante:

numrange.erase(numrange.cbegin() + i); 

Cependant, s'il vous plaît noter que vous initialisez i-vectsize, qui lui-même était initialisées à numrange.size(). Cela signifie que vous essayez d'effacer un élément après la fin de votre plage. Vous devez utiliser numrange.size() - 1.

De plus, il y a des surcharges qui effacent une plage à laquelle vous pouvez appliquer le même principe: décalage

numrange.erase(numrange.cbegin() + numrange.size()/2, numrange.cend()); 
0

La méthode erase de std::vector On attend un iterator au lieu d'un indice int comme argument.

Vous pouvez utiliser BEGIN-iterator et il suffit d'ajouter la quantité d'éléments pour passer à atteindre la iterator souhaitée:

for (int i=vectsize; i>=(vectsize/2); --i) {numrange.erase(numrange.begin()+i);}