(三)Boostライブラリの文字列処理
5167 ワード
文字列処理はc/c++の弱点でありstring_Algoライブラリはこの点をよく補った.
string_Algoライブラリアルゴリズム命名規則:接頭辞i:この接頭辞テーブル名アルゴリズムの大文字と小文字は敏感ではありません.そうしないと、大文字と小文字の敏感接尾辞_copy:この接尾辞はアルゴリズムが入力を変更せず、処理結果のコピーを返すことを示しています.そうしないと、アルゴリズムは接尾辞をその場で処理します.if:この接尾辞は、アルゴリズムが判断式の述語関数オブジェクトとして必要であることを示しています.そうしないと、デフォルトの判断基準が使用されます.
string_Algoライブラリが提供するアルゴリズムは5つの種類に分けられ、以下の通りである:【1】大文字と小文字の変換;【2】判断式と分類;【3】トリミング【4】検索と置換;【5】分割とマージ.
一、大文字と小文字の変換
to_upper to_lower
二、判断式
判定アルゴリズムは、【1】starts_を含む2つの文字列間の関係を検出することができる.with:1つの文字列が別の接頭辞であるかどうかを検出します.【2】ends_with: ...............接尾辞【3】contains:1つの文字列が別の文字列に含まれているかどうかを検出する.【4】equals:2つの文字列が等しいかどうかを検出する.【5】lexicographical_compare;辞書の順序に基づいて、1つの文字列が他の文字列より小さいかどうかを検出します.【6】allは、1つの文字列内のすべての要素が指定された判定式を満たすか否かを検出する.allを除いて、これらのアルゴリズムには別のi接頭辞のバージョンがあります.文字列を変更しないため、_はありません.copyバージョン
string_Algoは、文字列が何らかの特性に合致するかどうかを検出するために使用できる分類関数のセットを提供し、主に他のアルゴリズムを組み合わせるために使用される:【1】is_space:文字がスペースであるかどうか;【2】is_alnum:文字がアルファベットと数字であるかどうか.【3】is_Alpha:文字がアルファベットかどうか;【4】is_cntrl:文字が制御文字かどうか;【5】is_digit:文字が10進数を尋ねるかどうか;【6】is_graph:文字がグラフィック文字であるかどうか;【7】is_lower:文字手法は小文字;【8】is_print:文字が印刷文字であるかどうか;【9】is_punct:文字が句読点文字であるかどうか;【10】is_upper:文字が大文字かどうか;【11】is_xdigit:文字が16進数かどうか;【12】is_any_of:文字がパラメータ文字シーケンスの任意の文字であるかどうか.【13】if_from_range:文字が指定された区間内にあるかどうか、すなわちform<= ch<=to;注意:これらの関数は実際に文字を検出するのではなく、detail::is_を返します.classifiedFの関数オブジェクト、この関数オブジェクトのoperator()こそ本当の分類関数です(したがって、これらの関数はすべてファクトリ関数に属します).関数オブジェクトis_classifiedFは論理演算子|,&&を再ロードしました!,論理演算子を使用して、より複雑な条件判断を実現するために論理式に組み合わせることができます.
三、剪定
string_Algoは3つのトリムアルゴリズムを提供し、trim_left,trim_rightおよびtrimトリムアルゴリズムは、文字列開発または末尾のスペースを削除できます.ifと_copyの2種類の接尾辞、そのためどのアルゴリズムは4つのバージョンがあって、ifバージョンは、1つの判定式IsSpaceを受け取り、スペース(IsSpace(c)==true)と判定されたすべての文字を削除する.
string_Algoライブラリアルゴリズム命名規則:接頭辞i:この接頭辞テーブル名アルゴリズムの大文字と小文字は敏感ではありません.そうしないと、大文字と小文字の敏感接尾辞_copy:この接尾辞はアルゴリズムが入力を変更せず、処理結果のコピーを返すことを示しています.そうしないと、アルゴリズムは接尾辞をその場で処理します.if:この接尾辞は、アルゴリズムが判断式の述語関数オブジェクトとして必要であることを示しています.そうしないと、デフォルトの判断基準が使用されます.
string_Algoライブラリが提供するアルゴリズムは5つの種類に分けられ、以下の通りである:【1】大文字と小文字の変換;【2】判断式と分類;【3】トリミング【4】検索と置換;【5】分割とマージ.
一、大文字と小文字の変換
to_upper to_lower
二、判断式
判定アルゴリズムは、【1】starts_を含む2つの文字列間の関係を検出することができる.with:1つの文字列が別の接頭辞であるかどうかを検出します.【2】ends_with: ...............接尾辞【3】contains:1つの文字列が別の文字列に含まれているかどうかを検出する.【4】equals:2つの文字列が等しいかどうかを検出する.【5】lexicographical_compare;辞書の順序に基づいて、1つの文字列が他の文字列より小さいかどうかを検出します.【6】allは、1つの文字列内のすべての要素が指定された判定式を満たすか否かを検出する.allを除いて、これらのアルゴリズムには別のi接頭辞のバージョンがあります.文字列を変更しないため、_はありません.copyバージョン
string_Algoは、文字列が何らかの特性に合致するかどうかを検出するために使用できる分類関数のセットを提供し、主に他のアルゴリズムを組み合わせるために使用される:【1】is_space:文字がスペースであるかどうか;【2】is_alnum:文字がアルファベットと数字であるかどうか.【3】is_Alpha:文字がアルファベットかどうか;【4】is_cntrl:文字が制御文字かどうか;【5】is_digit:文字が10進数を尋ねるかどうか;【6】is_graph:文字がグラフィック文字であるかどうか;【7】is_lower:文字手法は小文字;【8】is_print:文字が印刷文字であるかどうか;【9】is_punct:文字が句読点文字であるかどうか;【10】is_upper:文字が大文字かどうか;【11】is_xdigit:文字が16進数かどうか;【12】is_any_of:文字がパラメータ文字シーケンスの任意の文字であるかどうか.【13】if_from_range:文字が指定された区間内にあるかどうか、すなわちform<= ch<=to;注意:これらの関数は実際に文字を検出するのではなく、detail::is_を返します.classifiedFの関数オブジェクト、この関数オブジェクトのoperator()こそ本当の分類関数です(したがって、これらの関数はすべてファクトリ関数に属します).関数オブジェクトis_classifiedFは論理演算子|,&&を再ロードしました!,論理演算子を使用して、より複雑な条件判断を実現するために論理式に組み合わせることができます.
三、剪定
string_Algoは3つのトリムアルゴリズムを提供し、trim_left,trim_rightおよびtrimトリムアルゴリズムは、文字列開発または末尾のスペースを削除できます.ifと_copyの2種類の接尾辞、そのためどのアルゴリズムは4つのバージョンがあって、ifバージョンは、1つの判定式IsSpaceを受け取り、スペース(IsSpace(c)==true)と判定されたすべての文字を削除する.
std::string strTrim = " hello ";
std::cout << trim_copy_if(strTrim, is_space()) << std::endl;
、 と
string_Algoが する アルゴリズムには、【1】find_first: で が めて れる を します.【2】find_Last: で に が された を します.【3】find_nth: のn (0からカウント)に が れる を します.【4】find_head: の のN の を り、substr(0,n)に する.【5】find_tail: の にN の を ります.
と : 、 に が された に を します.アルゴリズム は ています:【1】replace/erase_first: の の の を / する.【2】replace/erase_last:............... に れた.【3】replace/erase_nth:................n (0から)に れる.【4】replace/erase_all:................すべてが れる.【5】replace/erase_head: の / ;【6】replace/erase_tail: の を / する; の8つのアルゴリズムには、それぞれ i、 _があります.copyと み わせて、4つのバージョンがあり、 の4つは のみです.copyの2つのバージョン. std::cout << replace_all_copy(strRe, "beat", "BEAT") << std::endl;
ireplace_all(strRe, "samus", "SAMUS");
std::cout << strRe << std::endl;
std::cout << erase_tail_copy(strRe, 10) << std::endl;
、 と split、 join
ぶんかつ std::string strSplit = "A,,B,A::a,C-D,E_F";
std::vector<std::string> l;
//token_compress_on : , token_compress_off,
split(l, strSplit, is_any_of(",:-_"));
for (BOOST_AUTO(pos, l.begin()); pos != l.end(); ++pos)
{
std::cout << "[" << *pos << "]" ;
}
std::cout << std::endl;
l.clear();
split(l, strSplit, is_any_of(","), token_compress_on);
for (BOOST_AUTO(pos, l.begin()); pos != l.end(); ++pos)
{
std::cout << "[" << *pos << "]" ;
}
std::cout << std::endl;
std::vector<std::string> v = boost::assign::list_of("A")("B")("C")("D");
std::cout << boost::join( v, ",") << std::endl;
//
std::cout << boost::join_if(v, "*",
[](const std::string& x){return boost::contains(x, "A") || boost::contains(x, "B");}) <<std::endl;