en utilisant boost :: lambda_ pour compresser les espaces blancs dans une chaîne

StackOverflow https://stackoverflow.com/questions/1170801

  •  19-09-2019
  •  | 
  •  

Question

J'utilise boost :: lambda pour supprimer les espaces blancs suivants dans une chaîne, en laissant un seul espace. J'ai essayé ce programme.

#include <algorithm>
#include <iostream>
#include <string>
#include <boost/lambda/lambda.hpp>


int main()
{
    std::string s = "str     str st   st sss";
    //s.erase( std::unique(s.begin(), s.end(), (boost::lambda::_1 == ' ') && (boost::lambda::_2== ' ')), s.end()); ///< works
    s.erase( std::unique(s.begin(), s.end(), (boost::lambda::_1 == boost::lambda::_2== ' ')), s.end()); ///< does not work
    std::cout << s << std::endl;
    return 0;
}

fonctionne la ligne commentée très bien, mais celui décommentée ne fonctionne pas.

Comment

(boost::lambda::_1 == boost::lambda::_2== ' ') 

différent de

(boost::lambda::_1 == ' ') && (boost::lambda::_2== ' '))

dans le progam ci-dessus. Le commenté me donne aussi un avertissement que « avertissement C4805: « == »: mélange dangereux de type « bool » et type « const char » en fonctionnement »

Merci.

Était-ce utile?

La solution

En C et C ++ a == b == x est très différent de (a == x) && (b == x), le premier est interprété comme (a == b) == x, qui compare un avec b et le résultat de cette comparaison (vrai ou faux) est comparé avec x. Dans votre cas, x est un espace, et la mise en œuvre typique qui utilise son code ASCII est égal à 32, comparer avec une valeur booléenne qui est converti soit à 0 ou 1 donne toujours faux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top