我正在编写一种方法来读取字符串并丢弃所有字符,直到找到空格字符。我想出了这个:
void Utility::TrimToWhiteSpace( std::string& str )
{
size_t i = 0;
for( ; i < str.size() && !std::isspace( str[i], "C" ); i++ ){}
str.erase( 0, i );
}
我只需要这个循环进行计数,但将它留空是很奇怪的。例如,这会导致优化问题吗?
答案 0 :(得分:4)
这种“空”循环在查找时经常出现;没有
与他们真正的问题。虽然很多人,包括我自己,
在这种情况下,我会更喜欢while
,就像你写的那样for
这是完全可以接受的,应该没有问题。
当然,在惯用的C ++中,你会使用std::remove
和
std::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
可能有点冗长,而且确实如此
值得用你更合理的界面包装一次
工具包,并系统地使用包装器。