空循环仅用于计数

时间:2014-06-30 06:20:52

标签: c++ string loops

我正在编写一种方法来读取字符串并丢弃所有字符,直到找到空格字符。我想出了这个:

void Utility::TrimToWhiteSpace( std::string& str )
{
    size_t  i = 0;
    for( ; i < str.size() && !std::isspace( str[i], "C" ); i++ ){}
    str.erase( 0, i );
}

我只需要这个循环进行计数,但将它留空是很奇怪的。例如,这会导致优化问题吗?

1 个答案:

答案 0 :(得分:4)

这种“空”循环在查找时经常出现;没有 与他们真正的问题。虽然很多人,包括我自己, 在这种情况下,我会更喜欢while,就像你写的那样for 这是完全可以接受的,应该没有问题。

当然,在惯用的C ++中,你会使用std::removestd::find_if,而不是手写的循环:

str.remove(
    std::find_if( str.begin(), str.end(), []( char ch ) { return !std::isspace( ch, "C" ); } ),
    str.end() );

个人而言,我也避免使用两种参数形式 std::isspace除了在孤立的情况下。在这种情况下, 更多的东西:

static std::locale const cLocale( "C" );    //  Define locale to ensure lifetime.
static std::ctype<char> const& cType( std::use_facet<std::codecvt<char>>( cLocale ) );
str.remove(
    std::find_if( str.begin(), str.end(), [&]( char ch) { return !cType.is( std::ctype_base::space, ch ); } ),
    str.end() );

或者,如果您正在进行任何数量的文本处理:

template <std::ctype_base::mask mask>
class Is
{
    std::locale myCopyToEnsureLifetime;
    std::ctype<char> const* myCType;
public:
    Is( std::locale const& locale = std::locale() )
        : myCopyToEnsureLifetime( locale )
        , myCType( &std::use_facet<std::codecvt<char>>( myCopyToEnsureLifetime )
    {
    }
    bool operator()( char ch ) const
    {
        return myCType->is( mask, ch );
    }
};

template <std::ctype_base::mask mask>
class IsNot
{
    std::locale myCopyToEnsureLifetime;
    std::ctype<char> const* myCType;
public:
    Is( std::locale const& locale = std::locale() )
        : myCopyToEnsureLifetime( locale )
        , myCType( &std::use_facet<std::codecvt<char>>( myCopyToEnsureLifetime )
    {
    }
    bool operator()( char ch ) const
    {
        return !myCType->is( mask, ch );
    }
};

typedef Is<std::ctype_base::space> IsSpace;
typedef IsNot<std::ctype_base::space> IsNotSpace;
//  And so on...

直接使用std::locale可能有点冗长,而且确实如此 值得用你更合理的界面包装一次 工具包,并系统地使用包装器。