J’ai une structure que je souhaite utiliser pour supprimer des éléments d’un vecteur, je ne sais pas à quel index l’élément apparaîtra, je le supprime donc par valeur. Voici ma structure:
struct IsUnderScore{ bool operator()(char c){ return c=='_'; } };
Je peux utiliser cette structure pour supprimer des valeurs de chaînes, mais lorsque j’essaie d’utiliser un vecteur comme suit:
abc.erase(std::remove(abc.begin(), abc.end(), IsUnderScore()), abc.end());
Je reçois une erreur du compilateur disant qu’il n’y a pas de correspondance pour l’opérateur ==.
Donc, je sais que je dois surcharger cet opérateur lui-même, et en regardant certaines des autres implémentations de celui-ci tout au long de SO, je ne peux pas vraiment trouver d’implémentation qui corresponde à mon cas, la plupart des autres versions ont des variables déclarées dans leurs structures, mais c’est un simple bool pour voir si le caractère actuel correspond au trait de soulignement. Je suis un peu confus quant à la manière dont je devrais créer une surcharge correspondant à mon cas.
EDIT : Le vecteur en question est une chaîne de vecteur par la voie.
Le problème ne vient pas d’un operator==
manquant operator==
, mais de l’utilisation d’une mauvaise paire fonction + argument. remove()
prend un élément en tant que 3ème argument, pas un prédicat. Pour un prédicat, vous devez remove_if
. Alors faites l’une de celles-ci:
std::remove(abc.begin(), abc.end(), '_') // or std::remove_if(abc.begin(), abc.end(), IsUnderScore())
MODIFIER
Le 3ème paramètre de remove
est du type du type valeur de l’iterator. Le paramètre du prédicat utilisé dans remove_if
prend le même type. En fonction de votre édition, il s’agit de std::ssortingng
dans votre cas, vous devez donc l’utiliser en conséquence. Soit utiliser remove
avec une chaîne:
std::remove(abc.begin(), abc.end(), "_") // or std::remove(abc.begin(), abc.end(), std::ssortingng("_"))
Ou mettez à jour le prédicat à utiliser avec remove_if
:
struct IsUnderScore{ bool operator()(const std::ssortingng &s){ return s == "_"; } }; // ... std::remove_if(abc.begin(), abc.end(), IsUnderScore())
Vous utilisez std::remove
– il n’utilise pas le comparateur comme troisième argument, mais uniquement la valeur à supprimer. En supposant que votre vecteur abc
soit vector
use
std::remove(abc.begin(), abc.end(), '_')
Vous essayez plutôt de remove
remove_if
. (Ou vous essayez de remove
avec un foncteur, au lieu d’un caractère).
La solution la meilleure et la plus simple:
abc.erase(std::remove(abc.begin(), abc.end(), '_'), abc.end());
L’alternative (pas très utile ici, mais juste au cas où vous auriez besoin d’une comparaison plus complexe pour déterminer quel élément à supprimer):
abc.erase_if(std::remove_if(abc.begin(), abc.end(), IsUnderScore()), abc.end());