0

私はboost::lambdaを使用して、文字列内の後続の空白を削除し、スペースを1つだけ残しています。このプログラムを試してみました。

#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'とタイプ'constchar'の安全でない組み合わせが動作中です」という警告も表示します。

ありがとう。

4

1 に答える 1

5

CおよびC++では、a == b == xは(a == x)&&(b == x)とは大きく異なり、前者は(a == b)== xとして解釈され、aとbを比較します。その比較の結果(trueまたはfalse)がxと比較されます。あなたの場合、xはスペース文字であり、ASCIIを使用する一般的な実装では、そのコードは32に等しく、0または1に変換されるブール値と比較すると常にfalseになります。

于 2009-07-23T10:18:14.067 に答える