最简单的方法是使用算法中的函数,返回结果:
std::string
eraseAfterEq( std::string const& original )
{
std::string results;
std::string::const_iterator current = original.begin();
std::string::const_iterator next = std::find( current, original.end(), '=' );
while ( next != original.end() ) {
++ next;
results.append( current, next );
current = std::find_if( next, original.end(), IsAlpha() );
next = std::find( current, original.end(), '=' );
}
results.append( current, next );
return results;
}
或者,如果您想就地修改字符串:
void
eraseAfterEq( std::string& original )
{
std::string::iterator current = std::find( original.begin(), original.end(), '=' );
while ( current != original.end() ) {
++ current;
std::string::iterator next = std::find_if( current, original.end(), IsAlpha() );
current = std::find( original.erase( current, next ), original.end(), '=' );
}
}
在这两种情况下,IsAlpha
都是一个功能对象,应该在您的工具箱中:
template <std::ctype_base::mask m>
class Is : public std::unary_function<char, bool>
{
std::locale myLocale; // To ensure lifetime of facet...
std::ctype<char> const* myCType;
public:
Is( std::locale const& locale = std::locale() )
: myLocale( locale )
, myCType( &std::use_facet<std::ctype<char> >( myLocale ) )
{
}
bool operator()( char toTest ) const
{
return myCType->is( m, toTest );
}
};
typedef Is<std::ctype_base::alpha> IsAlpha;
// ...
我通常会选择功能版本。如果速度不够快,您可以尝试另一个。它可能会更快,因为它永远不必分配新内存。(或者它可能会更慢,因为它复制更多。对于您的示例字符串,复制可能比分配便宜,但这将取决于实际数据、编译器和您正在使用的系统。 )
IsAlpha
如果您不需要语言环境支持,或者您可以确定
您locale
正在使用的 . C 版本(in <ctype.h>
)isalpha
通常也更快(只是不要忘记你不能char
直接传递它 a ——你必须先传递static_cast
它unsigned char
)。或者,您可以尝试使用std::ctype::scan_is
而不是std::find_if
; 但是,使用它需要一些黑客攻击,因为它只支持char const*
: 如果我走这条路,我可能会使用和作为char const*
我的迭代器和。(
界面设计得特别差。)&original[0]
&original[0]
+ original.size()
begin()
end()
std::locale
如果没有实际的实验和测量,我无法告诉你哪种解决方案最快。即使在实验和测量之后,我也只能告诉你哪个在我的机器上最快,并且在我进行测量的确切环境中。它可能不是您机器上最快的。只需使用两个简单版本中最合适的一个,在需要之前不要担心性能。