en utilisant boost :: lambda_ pour compresser les espaces blancs dans une chaîne
-
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.
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.