Comment surcharger l’opérateur == ‘au sein d’une structure?

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());