読者です 読者をやめる 読者になる 読者になる

Boost String Algorithms Libraryの使い方 その1:trim/trim_left/trim_right

C++ Tips

VCLAnsiStringMFCのCStringと比べて、C++標準の汎用文字列クラスであるstd::stringは機能が貧弱。そいつを補完するのがboostのString Algorithms Library
以下はその簡単な使い方。


1.trim/trim_copy
trim関数は文字列の両端から空白を除去する。trim_copyは空白を除去した結果を返し、文字列そのものには影響を与えない。

#include <string>  
#include <boost/algorithm/string.hpp>  
void foo()
{
  std::string ss("  foo  ");
  boost::trim(ss);
}

2.trim_if/trim_copy_if
trim_ifは文字列の両端から条件を満たした部分を除去する。trim_copy_ifはtrim_copy同様、結果のみを返し、文字列そのものには影響を与えない。

#include <string>  
#include <boost/algorithm/string.hpp>  
void foo()
{
  std::string ss("#foo");
  boost::trim_if(ss, std::bind2nd(std::equal_to<char>(), '#'));
}

条件式は関数オブジェクトを渡す。また、範囲指定などいくつかの関数オブジェクトがString Algorithms Libraryに用意されている。

#include <string>  
#include <boost/algorithm/string.hpp>  
void foo()
{
  std::string ss("(12345)");
  boost::trim_if(ss, boost::is_any_of("()"));
}

関数オブジェクト"is_any_of"は文字列のうち、どれかを満たすもの。



trim系関数はほかに、左側のみを除去するtrim_left、右側のみを除去するtrim_rightがあり、それぞれ*_copy/*_if/*_copy_ifも用意されている。


20:20 追記:
これ、コメント(ツッコミサンクスです!)にもあるとおり、BCBでは無理です。orz(bcbboostも同様。)
Boostに関してはBCBは次の次(1.35か?)でサポート対象外になるのが濃厚っぽい。
まぁ、1.34はまだ出ていないし、来年夏くらい(だっけ?)に出て来るHighlander辺りに期待するしかないか。
こんな時は素直にAnsiStringを使いましょう。って、BCBでstd::string使う機会ってあまりないからな・・・。おいらの場合、boost::tokenizerとboost::regexくらいしか記憶ないし。