effacer () après avoir effectué remove_if ()
J'ai créé une fonction à exécuter par l'intermédiaire d'un vecteur de chaînes et de supprimer toutes les chaînes de longueur 3 ou moins. C'est une leçon dans l'utilisation de la STL Algorithme de la bibliothèque.
Je vais avoir des problèmes en ce que les fonctions de travail, mais pas seulement de supprimer des chaînes de longueur 3 ou moins, mais il ajoute également la chaîne "vecteur" à la fin.
La sortie doit être
This test vector
et c'est plutôt
This test vector vector"
Comment puis-je résoudre ce problème?
/*
* using remove_if and custom call back function, write RemoveShortWords
* that accepts a vector<string> and removes all strings of length 3 or
* less from it. *shoot for 2 lines of code in functions.
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
using namespace std;
bool StringLengthTest(string test) //test condition for remove_if algo.
{
return test.length() <= 3;
}
void RemoveShortWords(vector<string> &myVector)
{
//erase anything in vector with length <= 3
myVector.erase(remove_if(myVector.begin(),
myVector.end(),
StringLengthTest));
}
int main ()
{
//add some strings to vector
vector<string> myVector;
myVector.push_back("This");
myVector.push_back("is");
myVector.push_back("a");
myVector.push_back("test");
myVector.push_back("vector");
//print out contents of myVector (debugging)
copy(myVector.begin(), myVector.end(), ostream_iterator<string>(cout," "));
cout << endl; //flush the stream
RemoveShortWords(myVector); //remove words with length <= 3
//print out myVector (debugging)
copy(myVector.begin(), myVector.end(), ostream_iterator<string>(cout," "));
cout << endl;
system("pause");
return 0;
}
source d'informationauteur MCP
Vous devez vous connecter pour publier un commentaire.
Il est plus facile à comprendre si vous séparez les déclarations:
Ces 2 lignes de faire la même chose que votre seule ligne. Et il devrait être clair maintenant que le "bug" est. remove_if, fonctionne bien. Il effectue une itération sur l'ensemble de vecteur et déplace tous les "sélectionnés" entrées "à la fin" (pour mieux dire: il se déplace de la non entrées sélectionnées à l'avant). Après exécution, il retourne un itérateur pour la "dernière" de la position de la gauche sur les entrées, quelque chose comme:
Ensuite, vous exécutez effacer avec un seul itérateur. Cela signifie que vous effacer un seul élément pointé - vous effacer le "test" de l'élément. - Qu'est-ce qui reste est ce que vous voyez.
De le fixer simplement effacer à partir du vecteur renvoyé par remove_if à la fin().:
Vous devriez être en utilisant les deux paramètres de forme d'effacement: