最も簡単な方法は、アルゴリズムで関数を使用して結果を返すことです。
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 バージョン (の<ctype.h>
)は、多くの場合、同様に高速です (ただし、
直接isalpha
渡すことができないことを忘れないでください。最初に渡さなければなりません)。または、代わりに;を使用して実験することもできます。ただし、これは のみをサポートするため、使用するには多少のハッキングが必要になります。(
インターフェイスの設計が特に不十分です。)char
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
実際に実験して測定しないと、どのソリューションが最速かはわかりません。実験と測定を行った後でも、自分のマシンと、測定を行った正確なコンテキストでどちらが最速であったかしかわかりませんでした. あなたのマシンでは最速ではないかもしれません。2 つの単純なバージョンのどちらか適切な方を使用するだけで、必要になるまでパフォーマンスについて心配する必要はありません。