Show page source of string_methods #114821

= 色々な C/C++ ライブラリの文字列の機能比較
== はじめに
文字列を処理するクラスや構造体は、色々な C/C++ ライブラリで実装されています。STLの std::string には無い機能やちょっと違ったテイストの書き方ができたりするので色々使ってみるのは楽しいのですが、
どのライブラリにどの機能があるのか、引数の数や順番がどうなっているのかがわからなくなってしまいました。
ここでは、それぞれのライブラリの文字列処理機能の対応表を作成して、機能比較してみたいと思います。
空欄のところは未調査です。

== 比較表
|| <<生成・初期化>> || STL || OpenNurbs || TTW(Tcl) || ptypes ||
|| 文字列を指定 ||std::string str("abc"); || ON_String str("abc"); || || pt::string str("abc"); ||
|| 部分文字列を指定[[BR]]const char *ps = "abc";[[BR]]const char *pe = ps + 3; || std::string str(ps, pe); || ON_String str(ps, 3); || || pt::string str(ps, 3); ||
|| コピー || std::string str1("abc");[[BR]]std::string str2(str1); || ON_String str1("abc");[[BR]]ON_String str2(str1);|| || pt::string str2(str1);[[BR]](※コピー・オン・ライト対応?) ||
|| 内容消去 || str.clear(); || str.Destroy(); || || clear(str); ||
|| 新しい文字列に差し替え || str1 = "abc"; [[BR]]str2 = str; || str1 = "abc"; [[BR]]str2 = str; || || initialize(str1, "abc");[[BR]]initialize(str2, str);[[BR]]assign(str3, "abc...", 3);[[BR]]<結果> str1~str3全て "abc" ||
|| 同じ文字をn個並べる ||std::string str(n,'a'); || ON_String str('a', n); || || pt::string str1 = fill(n, 'a');[[BR]]// 他の文字列をベースに、[[BR]]//左詰め、または右詰めで埋める。[[BR]] pt::string str2("abcdefg");[[BR]]pt::string str3 = pad(str2, 3, 'x', true);[[BR]]pt::string str4 = pad(str2, 3, 'x', false);[[BR]]<結果>[[BR]]str3: "xxxdefg"[[BR]]str4: "abcdxxx"||
|| || || || || ||
|| <<編集>> || STL || OpenNurbs || TTW(Tcl) || ptypes ||
|| 文字列の追加 || str += "abc";[[BR]]str2 += str1; || str += "abc";[[BR]]str2 += str1;[[BR]]str2.Append("abc"); || || str += "abc";[[BR]]str2 += str1;[[BR]]concat(str2, "abc"); [[BR]] concat(str2, "abcde...", 3); // 部分文字列対応[[BR]]concat(str2, str1); ||
|| 内部ストレージサイズを文字列長にフィット || str.shrink_to_fit(); (※C++11~) || str.ShrinkArray(); || || (※内部ストレージは常に文字列長+1) ||
|| printf 書式で整形 ||  || str.Format("%s %d", "abc", 11);[[BR]]・追記ではなく、初期化。[[BR]]・実装は vsnprintf[[BR]](VisualStudioの場合は_vsnprintf)[[BR]]・書式整形後の文字長は[[BR]]終端ヌル込みで 2048 まで。[[BR]]超えた分は捨てられる。||  ||  ||
|| 大文字→小文字 ||  || str.MakeLower(); ||  char *str = "ABcde"; [[BR]] Tcl_UtfToLower(str); || pt::string str1 = lowercase("ABCDE!!!");[[BR]] pt::string str3 = lowercase(str2); ||
|| 小文字→大文字 ||  || str.MakeUpper(); ||  char *str = "ABcde"; [[BR]] Tcl_UtfToUpper(str); || pt::string str1 = uppercase("abcde!!!");[[BR]] pt::string str3 = uppercase(str2); ||
|| その他 || || // ファイルパスの分解[[BR]]ON_String drive, dir, fn, ext;[[BR]]const char *path = "c:\\Windows\\hoge.dll";[[BR]]ON_String::SplitPath(path, &drive, &dir, &fn, &ext); || || ||
|| || || || || ||
|| <<数値型を文字列に変換>> || STL || OpenNurbs || TTW(Tcl) || ptypes ||
|| || || || || ||
|| <<情報取得>> || STL || OpenNurbs || TTW(Tcl) || ptypes ||
|| const char * 取得 || const char *p = str.c_str(); || const char *p = str.First(); || || const char *p = str; ||
|| 内部ストレージサイズの取得 || size_t sz = str.capacity(); || int sz = str.Capacity(); || || ||
|| i番目の文字の取得 || char c = str![i]; || char c = str![i];[[BR]] char c = str.GetAt(i); || || ||
|| 文字列長(char単位)の取得 || size_t l = str.size(); || int l = str.Length(); || || ||
|| 文字数の取得 || || || Tcl_NumUtfChars(str); || ||
|| || || || || ||
|| <<比較>> || STL || OpenNurbs || TTW(Tcl) || ptypes ||
|| 比較(比較演算子 <、<=、==、>、>=、!= でブーリアンを返す) || 〇 || 〇 || || ==、 != のみ ||
|| 比較(str1 < str2 → 負、 str1 == str2 → 0、 str1 > str2 → 正) || int flg = str1.compare(str2); || int flg = str1.Compare(str2); || Tcl_UtfNcmp(str1, str2, num); || ||
|| 大文字・小文字を区別しない比較 || × || str1.CompareNoCase(str2); || Tcl_UtfNcasecmp(str1, str2, num); || strcasecmp(str1, str2);[[BR]](※VCの場合、#define strcasecmp stricmp) ||
|| || || || || ||
|| <<検索>> || STL || OpenNurbs || TTW(Tcl) || ptypes ||
|| パターンマッチング ||  || bool rc;[[BR]]rc = str.WildCardMatch("ab*");[[BR]]rc = str.WildCardMatchNoCase("ab*");[[BR]]rc = ON_WildCardMatch("abcde", "ab*");[[BR]]rc = ON_WildCardMatchNoCase("abcde", "ab*"); || || ||
|| || || || || ||