2016-05-17 2 views
-2

Je dois créer une liste de chaînes et de supprimer des lettres majuscules avec lambda et écrire dans une autre liste, donc j'essayer mais j'ai bug: [Error] request for member 'erase' in 'c', which is of non-class type 'const char'retirer les lettres majuscules de la liste et l'écrire dans une autre liste

list<string> ls {"hak","ala","alA","coS","KtOs"}; 
list<string> ls2; 
for(auto k : ls)cout<<k<<endl<<endl; 
transform(ls.begin(),ls.end(),ls.begin(),[](string &s) {  
      transform(s.begin(),s.end(),s.begin(), [](const char& c) { 
        if(isupper(c));return c.erase(isupper(c)) ; 
       }); 
      return s; 
+3

Lorsque vous avez quelques bugs * *, vous devez appliquer * quelques corrections *. – SergeyA

+0

J'ai un bug: [Erreur] demande de membre 'effacer' dans 'c', qui est de type non-classe 'const char' – grapexs

Répondre

1

Cette lambda de la vôtre:

[](const char& c) { 
    if(isupper(c)); 
      return c.erase(isupper(c)) ; 
} 

Vous avez un ; dans votre if ... efficacement la traduction à un code mort ... Et c est de type char, il n'a pas m braise. Qu'est-ce que vous essayez même de faire? isupper renvoie une valeur non nulle (ce qui signifie que cela pourrait être n'importe quoi) pour signifier true.

ce que je présume que vous voulez faire est:

transform(ls.begin(), ls.end(), back_inserter(ls2), 
      [](string s) -> string 
      { 
       s.erase(remove_if(s.begin(), s.end(), 
          [](char c){ 
            return isupper(c); 
          }), s.end() 
         ); 
        return s; 
      }); 

Encore une fois, j'utilisé back_inserter pour la nouvelle liste parce que son supposé qu'il ne contient pas encore aucun élément. L'autre est Remove/Erase Idiom. Et s'il vous plaît voir la documentation de isupper.

Exemple complet ici: http://coliru.stacked-crooked.com/a/4df3c806d7d35de4

+0

Merci, vous êtes très utile. – grapexs