использование boost::lambda_ для сжатия пробелов в строке

Я использую boost::lambda для удаления последующих пробелов в строке, оставляя только один пробел. Я пробовал эту программу.

#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;
}

закомментированная строка работает нормально, а не закомментированная - нет.

Как

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

отличный от

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

в вышеуказанной программе. Комментарий также дает мне предупреждение о том, что «предупреждение C4805: '==': небезопасное сочетание типа 'bool' и типа 'const char' в работе»

Спасибо.


person navigator    schedule 23.07.2009    source источник
comment
А как насчет boost::regex? Заменить /(\s)+/$1? ;-)   -  person Dario    schedule 23.07.2009


Ответы (1)


В C и C++ a == b == x сильно отличается от (a == x) && (b == x), первое интерпретируется как (a == b) == x, что сравнивает a с b и результат этого сравнения (истина или ложь) сравнивается с x. В вашем случае x - это символ пробела, и в типичной реализации, использующей ASCII, его код равен 32, сравнение его с логическим значением, которое преобразуется либо в 0, либо в 1, всегда дает false.

person robson3.14    schedule 23.07.2009