バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.


RWWString

形式

#include <rw/wstring.h>
RWWString a;

説明

このクラスは、ワイド文字の文字列を操作するための非常に強力で使い易い機能を提供します。

このクラスは、標準 C 言語の型 wchar_t のワイド文字を処理します。この型の文字は普通 2 バイトか 4 バイトから成り、従来の "char" 型よりも豊富なコードセットを作成できます (Solaris では wchar_t は 4 バイトです)。wchar_t 型の文字はすべて同じサイズなので、インデックス付けは高速です。

複数バイト文字と ASCII 形式との変換は、RWWString() コンストラクタ、および RWWString メンバー関数の isAscii()toAscii()toMultiByte() によって行います。

ストリーム操作は、複数バイトストリーム表現との変換処理を含んでいます。つまり、出力時はワイド文字の文字列を複数バイト文字列に変換し、入力時は複数バイト文字列をワイド文字の文字列に変換します。ワイド文字の文字列の外部表現は通常、複数バイト文字の文字列であるため、記憶領域は節約され、複数バイト文字列を想定している装置とのインタフェースは簡単になります。

このクラスでは、埋め込まれたヌルも有効です。

const wchar_t* 型のパラメータに NULL ポインタを渡してはなりません。ライブラリのデバッグバージョンで検出されます。

このクラスは、書き込み時にコピーを行うという技法を使用して実装します。この技法では、コピーコンストラクタと代入演算子は古いオブジェクトを参照するので、処理は非常に高速です。実際のコピーは、"書き込み" が行われたとき、つまりオブジェクトが変わったときにだけ作成されます。その結果、性能は向上し、コピーの意味はわかりやすくなっています。

RWWSubString というクラスは、部分文字列の抽出と変更をサポートします。

持続性

単純

#include <rw/rstream.h>
#include <rw/wstring.h>

main(){
 RWWString a(L"There is no joy in Beantown");
 a.subString(L"Beantown") = L"Redmond";
 cout << a << endl;
 return 0;
}

プログラム出力:

There is no joy in Redmond.

列挙型

enum RWWString::caseCompare { exact, ignoreCase };

比較、検索およびハッシュの各関数において、大文字と小文字を区別する (exact) か、区別しない (ignoreCase) かを指定するのに使用します。

enum RWWString::multiByte_ { multiByte };

複数バイト文字列からワイド文字列への変換処理を制御します。詳細は次のコンストラクタの説明を参照してください。

enum RWWString::ascii_ {ascii };

ASCII 文字列からワイド文字列への変換処理を制御します。詳細は次のコンストラクタの説明を参照してください。

公開コンストラクタ

RWWString();

文字数がゼロの文字列 (空文字列) を作成します。

RWWString(const wchar_t* cs);

ワイド文字列 cs から文字列を作成します。作成された文字列には、最初の終端ワイドヌル文字まで文字列 cs のデータがコピーされます。

RWWString(const wchar_t* cs, size_t N);

ワイド文字列 cs から文字列を作成します。作成された文字列には、ワイド文字列 cs のデータのうち埋め込まれたヌルを含めてちょうど N ワイド文字分がコピーされます。したがって、cs が指すバッファには少なくとも N* sizeof (wchar_t) バイト長または N ワイド文字長が必要です。

RWWString(RWSize_T ic);

長さがゼロの文字列 (空文字列) を作成します。この文字列には容量 ic が与えられます。

RWWString(const RWWString& str);

コピーコンストラクタ。作成された文字列には str のデータがコピーされます。

RWWString(const RWWSubString& ss);

部分文字列から変換します。作成された文字列には ss 部分文字列がコピーされます。

RWWString(char c);

単一文字 c を含む文字列を作成します。

RWWString(char c, size_t N);

N 回繰り返された文字 c を含む文字列を作成します。

RWWString(const char* mbcs, multiByte_ mb);

mbcs に含まれる複数バイト文字列からワイド文字列を作成します。変換は標準 C ライブラリ関数 ::mbstowcs() を使用して行われます。このコンストラクタは次のようにして使用できます。

   RWWString a("\306\374\315\313\306\374", multiByte);

RWWString(const char* acs, ascii_ asc);

acs に含まれる ASCII 文字列からワイド文字列を作成します。MSB を単に取り除くだけで変換を行うため、上記の一般的なコンストラクタよりも処理が高速になります。その際、 RWCString::isAscii() を使用することができます。このコンストラクタは次のようにして使用できます。

   RWWString a("An ASCII character string", ascii);
   RWWString(const char* cs, size_t N, multiByte_ mb);
   RWWString(const char* cs, size_t N, ascii__ asc);

RWWString(const char* cs, size_t N, multiByte_ mb);
RWWString(const char* cs, size_t N, ascii_ asc);

この 2 つのコンストラクタは、埋め込まれたヌルを入れてちょうど N 文字コピーされるという点を除いて、上の 2 つのコンストラクタと似ています。したがって、cs が指すバッファには少なくとも N バイト長が必要です。

型変換

operator
const wchar_t*() const;

ワイドヌル文字で終了する文字列として RWWString のデータをアクセスします。この文字列は RWWString のデータで、削除や変更はできません。RWWString オブジェクト自身が変化したら、以前に返されたポインタ値は無効になるかもしれません。この文字列はワイドヌル文字で終わるため、長さはメンバー関数の length() から与えられるので、注意してください。つまり、この文字列には埋め込まれたヌルを含めることができます。

代入演算子

RWWString&
operator=(const char* cs);

代入演算子。cs が指す、ヌル文字で終わる文字列を自分自身にコピーします。自分自身への参照を返します。

RWWString&
operator=(const RWWString& str);

代入演算子。str のデータをコピーし、自分自身への参照を返します。

RWWString&
operator=(const RWWSubString& sub);

代入演算子。sub のデータをコピーし、自分自身への参照を返します。

RWWString&
operator+=(const wchar_t* cs);

文字列 cs を自分自身に追加し、自分自身への参照を返します。

RWWString&
operator+=(const RWWString& str);

文字列 str を自分自身に追加し、自分自身への参照を返します。

インデックス付け演算子

wchar_t&
operator[](size_t i);
wchar_t
operator[](size_t i) const;

i 番目の文字を返します。最初に記述した可変要素を左辺値として使用できます。インデックス i は 0 〜 (文字列長 -1) の範囲になければなりません。境界検査を行い、インデックスが範囲外にあると RWBoundsErr 型の例外が発生します。

wchar_t&
operator()(size_t i);
wchar_t
operator()(size_t i) const;

i 番目の文字を返します。最初に記述した可変要素を左辺値として使用できます。インデックス i は 0 〜 (文字列長 -1) の範囲になければなりません。<rw/wstring.h> を取り込む前に前処理マクロ RWBOUNDS_CHECK を定義した場合、境界検査を行います。このとき、インデックスが範囲外にあると RWBoundsErr 型の例外が発生します。

RWWSubString
operator()(size_t start, size_t len);
const RWWSubString
operator()(size_t start, size_t len) const;

部分文字列演算子。自分自身の部分文字列で、インデックス start で始まる長さ lenRWWSubString を返します。最初に記述した可変要素を左辺値として使用できます。start + len の長さは文字列長以下でなければなりません。ライブラリが RWDEBUG フラグを使用して作成されていて、かつ startlen が範囲外にあると RWBoundsErr 型の例外が発生します。

公開メンバー関数

RWWString&
append(const wchar_t* cs);

cs が指す、ワイドヌル文字で終わるワイド文字列のコピーを自分自身に追加し、自分自身への参照を返します。

RWWString&
append(const wchar_t* cs, size_t N,);

ワイド文字列 cs のコピーを自分自身に追加します。ワイド文字列中のワイドヌル文字を含めてちょうど N 文字分追加されます。したがって cs が指すバッファには少なくとも N* sizeof(wchar_t) バイト長が必要です。自分自身への参照を返します。

RWWString&
append(const RWWString& cstr);

文字列 cstr のコピーを自分自身に追加し、自分自身への参照を返します。

RWWString&
append(const RWWString& cstr, size_t N);

cstr 文字列の最初の N 文字または cstr 文字列の長さのうち少ない方を自分自身に追加し、自分自身への参照を返します。

size_t
binaryStoreSize() const;

次の大域関数を使用してオブジェクトを格納するのに必要なバイト数を返します。

   RWFile& operator<<(RWFile&, const RWWString&);
size_t
capacity() const;

自分自身の現在の容量を返します。これは文字列がサイズを変更せずに保持できる文字の数で示します。

size_t
capacity(size_t capac);

自分自身の容量を capac に変更することが望ましいことをライブラリに伝えます。実際の容量を返します。

int
collate(const RWWString& str) const;
int
collate(const wchar_t*   str) const;

自分自身に対して POSIX 関数 ::wscoll() を呼び出し、その結果と引数 str に応じて、ゼロ未満、ゼロより大きい、またはゼロの整数を返します。ロケール依存型の照合 (コレート) をサポートします。

int
compareTo(const RWWString& str,
          caseCompare = RWWString::exact) const;
int
compareTo(const wchar_t*   str,
          caseCompare = RWWString::exact) const;

自分自身に対して標準 C ライブラリ関数 ::memcmp() を呼び出し、その結果と引数 str に応じて、ゼロ未満、ゼロより大きい、またはゼロの整数を返します。大文字と小文字を区別するかどうかは caseCompare 引数によって決まります。RWWString::exactRWWString::ignoreCase のいずれかになります。

RWBoolean
contains(const RWWString& cs,
         caseCompare = RWWString::exact) const;
RWBoolean
contains(const wchar_t* str,
         caseCompare = RWWString::exact) const;

パターンマッチング。cs が自分自身内に存在すれば TRUE を返します。大文字と小文字を区別するかどうかは caseCompare 引数によって決まります。RWWString::exactRWWString::ignoreCase のいずれかになります。

const wchar_t*
data() const;

ワイドヌル文字で終了する文字列 RWWString のデータにアクセスします。使用には注意を要します。この文字列は RWWString が管理するデータで、削除や変更はできません。RWWString オブジェクト自身が変化したら、以前に返されたポインタ値は無効になるかもしれません。この文字列はワイドヌル文字で終わりますが、長さはメンバー関数の length() から与えられるので注意してください。つまり、この文字列にはヌル文字が埋め込まれているかもしれません。

size_t
first(wchar_t c) const;

自分自身内で最初に現われるワイド文字 c のインデックスを返します。c がなければ、または c を見つける前に文字列中のワイドヌル文字があれば、RW_NPOS を返します。

size_t
first(wchar_t c, size_t) const;

自分自身内で最初に現われるワイド文字 c のインデックスを返します。文字列中のワイドヌル文字を越えても検索を続けます。c がなければ、RW_NPOS を返します。

size_t
first(const wchar_t* str) const;

自分自身内で最初に現われる str 内の任意の文字 c のインデックスを返します。文字列がないか、または str 内の任意の文字列を見つける前に文字列中のワイドヌル文字があれば、RW_NPOS を返します。

size_t
first(const wchar_t* str, size_t N) const;

自分自身内で最初に現われる str 内の任意の文字 c のインデックスを返します。文字列中のワイドヌル文字も含めて正確に N 文字がチェックされるため、str は少なくとも N ワイド文字を含むバッファを指していなければなりません。そのようなパターンが存在しないときは RW_NPOS を返します。

unsigned
hash(caseCompare = RWWString::exact) const;

適切なハッシュ値を返します。

size_t
index(const wchar_t* pat,size_t i=0,
      caseCompare = RWWString::exact) const;
size_t
index(const RWWString& pat,size_t i=0,
      caseCompare = RWWString::exact) const;

パターンマッチング。自分自身内でインデックス i から pat の検索を開始し、最初に検出した pat のインデックスを返します。そのようなパターンが存在しないときは、RW_NPOS を返します。大文字と小文字を区別するかどうかは caseCompare 引数によって決まります。デフォルトは RWWString::exact です。

size_t
index(const wchar_t* pat, size_t patlen,size_t i,
      caseCompare) const;
size_t
index(const RWWString& pat, size_t patlen,size_t i,
      caseCompare) const;

パターンマッチング。自分自身内の pat でインデックス i から最初の patlen 文字を検索し、一致した文字列の先頭のインデックスを返します。そのようなパターンが存在しないときは、RW_NPOS を返します。大文字と小文字を区別するかどうかは caseCompare 引数によって決まります。

RWWString&
insert(size_t pos, const wchar_t* cs);

ワイドヌル文字で終わる文字列 cs のコピーを自分自身の pos の位置に挿入し、自分自身への参照を返します。

RWWString&
insert(size_t pos, const wchar_t* cs, size_t N);

文字列 cs の最初の N ワイド文字のコピーを自分自身の pos の位置に挿入します。N ワイド文字の中にはワイドヌル文字が含まれていてもかまいません。したがって、cs が指すバッファには少なくとも N* sizeof(wchar_t) バイト長が必要です。自分自身への参照を返します。

RWWString&
insert(size_t pos, const RWWString& str);

文字列 str のコピーを自分自身の pos の位置に挿入し、自分自身への参照を返します。

RWWString&
insert(size_t pos, const RWWString& str, size_t N);

文字列 str の最初の N ワイド文字か str 文字列長のうちどちらか少ないほうを自分自身の pos の位置に挿入し、自分自身への参照を返します。

RWBoolean
isAscii() const;

問題なく変換 toAscii() が実行できる、つまり自分自身内の文字がすべて ASCII 文字ならば TRUE を返します。

RWBoolean
isNull() const;

自分自身が長さゼロのワイド文字列 (空文字列) の場合、TRUE を返します。

size_t
last(wchar_t c) const;

文字列内で最後に現れる文字 c のインデックスを返します。c がなければ、RW_NPOS を返します。

size_t
length() const;

自分自身内の文字数を返します。

RWWString&
prepend(const wchar_t* cs);

cs が指す、ワイドヌル文字で終わる文字列のコピーを自分自身の先頭に追加します。自分自身への参照を返します。

RWWString&
prepend(const wchar_t* cs, size_t N,);

文字列 cs のコピーを自分自身の先頭に追加します。文字列中のワイドヌル文字を含めてちょうど N 文字分コピーします。したがって、cs が指すバッファには少なくとも N* sizeof(wchar_t) ワイド文字長が必要です。

RWWString&
prepend(const RWWString& str);

文字列 str を自分自身の先頭に追加し、自分自身への参照を返します。

RWWString&
prepend(const RWWString& cstr, size_t N);

文字列 cstr の最初の N 文字か cstr 文字列長のうちどちらか少ないほうを自分自身の先頭に追加し、自分自身への参照を返します。

istream&
readFile(istream& s);

EOF に達するまで入力ストリーム s から文字を読み込み、自分自身の以前の内容を書き換えます。入力ストリームは複数バイト文字のシーケンスとみなされ、それぞれの文字は標準 C ライブラリ関数 mbtowc() を使用してワイド文字に変換されてから格納されます。ヌル文字は他の文字と同様に扱われます。

istream&
readLine(istream& s, RWBoolean skipWhite = TRUE);

復帰改行か EOF に達するまで入力ストリーム s から文字を読み込み、自分自身の以前の内容を書き換えます。復帰改行は、入力ストリームから取り除かれますが、格納されません。入力ストリームは複数バイト文字のシーケンスとみなされ、それぞれの文字は標準 C ライブラリ関数 mbtowc() を使用してワイド文字に変換されてから格納されます。ヌル文字は他の文字と同様に扱われます。skipWhite 引数が TRUE であれば iostream ライブラリマニピュレータ ws を使用して空白をスキップし、その後文字を保存します。

istream&
readString(istream& s);

EOF かヌル終端文字に達するまで入力ストリーム s から文字を読み込み、自分自身の以前の内容を書き換えます。入力ストリームは複数バイト文字のシーケンスとみなされ、それぞれの文字は標準 C ライブラリ関数 mbtowc() を使用してワイド文字に変換されてから格納されます。

istream&
readToDelim(istream&, wchar_t delim=(wchar_t)'\n');

EOF か区切り文字 delim に達するまで入力ストリーム s から文字を読み込み、自分自身の以前の内容を書き換えます。区切り文字は入力ストリームから取り除かれますが、格納されません。入力ストリームは複数バイト文字のシーケンスとみなされ、それぞれの文字は標準 C ライブラリ関数 mbtowc() を使用してワイド文字に変換されてから格納されます。ヌル文字は、他の文字と同様に扱われます。

istream&
readToken(istream& s);

空白を読み飛ばしてから文字をワイド文字列に格納します。後続の空白か EOF に達するまで、入力ストリーム s から文字を読み込み、自分自身の以前の内容を書き換えます。入力ストリーム内の残りの空白はそのまま残されます。標準 C ライブラリ関数 isspace() で定義された ASCII 空白文字だけが認識されます。入力ストリームは複数バイト文字のシーケンスとみなされ、それぞれの文字は標準 C ライブラリ関数 mbtowc() を使用してワイド文字に変換されてから格納されます。

RWWString&
remove(size_t pos);

pos の位置から文字列の最後までの文字 (長さは length() を超えない) を取り除き、自分自身への参照を返します。

RWWString&
remove(size_t pos, size_t N);

pos の位置から N ワイド文字、または文字列の終わりのうちどちらか (長さは length() を超えない) 速い方を取り除き、自分自身に参照を返します。

RWWString&
replace(size_t pos, size_t N, const wchar_t* cs);

pos の位置から N ワイド文字、または文字列の終わりのうちどちらか (長さは length() を超えない) 速い方を、ワイドヌル文字で終わる文字列 cs で置き換えます。自分自身の参照を返します。

RWWString&
replace(size_t pos, size_t N1,const wchar_t* cs, size_t N2);

pos の位置から N1 文字、または文字列の終わりのうちどちらか (長さは length() を超えない) 速い方を、文字列 cs で置き換えます。コピーされるのは文字列中のワイドヌル文字を含む N2 文字です。したがって、cs が指すバッファには少なくとも N2* sizeof(wchar_t) ワイド文字長が必要です。自分自身への参照を返します。

RWWString&
replace(size_t pos, size_t N, const RWWString& str);

pos の位置から N 文字、または文字列の終わりのうちどちらか (長さは length() を超えない) 速い方を、文字列 str のコピーで置き換えます。自分自身への参照を返します。

RWWString&
replace(size_t pos, size_t N1,
        const RWWString& str, size_t N2);

pos の位置から N1 文字、または文字列の終わりのうちどちらか (長さは length() を超えない) 速い方を、文字列 str の最初の N2 文字または str 文字列長のうちどちらか少ない方で置き換えます。自分自身への参照を返します。

void
resize(size_t n);

自分自身の長さを変更します。必要に応じて、空白 (L' ') を補うか文字列を切り捨てます。

RWWSubString
strip(stripType s = RWWString::trailing, wchar_t c = L' ');
const RWWSubString
strip(stripType s = RWWString::trailing, wchar_t c = L' ')
      const;

自分自身から、その最初、最後または両端にある文字 c を取り除いた部分文字列を返します。最初に記述したほうは左辺値として使用できます。列挙型 stripType は次のような値を取ります。

stripType 意味
leading 文字列の最初から文字を取り除く
trailing 文字列の最後から文字を取り除く
both 文字列の最初と最後から文字を取り除く

RWWSubString
subString(const wchar_t* cs, size_t start=0,
          caseCompare = RWWString::exact);
const RWWSubString
subString(const wchar_t* cs, size_t start=0,
          caseCompare = RWWString::exact) const;

文字列 cs が最初に現われる部分文字列を返します。大文字と小文字を区別するかどうかは caseCompare 引数によって決まります。デフォルトは RWWString::exact です。最初に記述したほうは左辺値として使用できます。

RWCString
toAscii() const;

ASCII 文字だけを含む、自分自身と同じ長さの RWCString オブジェクトを返します。自分自身内の非 ASCII 文字は MSB がオフになります。この関数を使用してよいかどうかは、isAscii() で決めます。

RWCString
toMultiByte() const;

標準 C ライブラリ関数 wcstombs() を自分自身に適用した結果を含む RWCString を返します。この関数はいつでも使用できます。

void
toLower();

自分自身内の大文字をすべて小文字に変換します。C ライブラリ関数 towlower() を使用します。

void
toUpper();

自分自身内の小文字をすべて大文字に変換します。C ライブラリ関数 towupper() を使用します。

静的公開メンバー関数

static unsigned
hash(const RWWString& wstr);

wstr.hash(RWWString::exact) により返される wstr のハッシュ値を返します。

static size_t
initialCapacity(size_t ic = 15);

RWWString の最小初期容量を設定し、以前の値を返します。初期設定値は 15 ワイド文字です。値が大きいとメモリーを多く必要としますが、文字列を連結したり読み込むときにサイズ変更を頻繁に行う必要がありません。値が小さいとメモリーは少なくて済みますが、サイズ変更を頻繁に行うことになります。

static size_t
maxWaste(size_t mw = 15);

文字列内の未使用領域の最大容量を設定し、以前の値を返します。初期設定値は 15 ワイド文字です。mw 文字以上消費すると、超過した領域は返還を要求されます。

static size_t
resizeIncrement(size_t ri = 16);

文字列を拡張するためにさらにメモリーが必要になったときのサイズ増分量を設定し、以前の値を返します。初期設定値は 16 ワイド文字です。

関連の大域演算子

RWBoolean
operator==(const RWWString&, const wchar_t*  );
RWBoolean
operator==(const wchar_t*,   const RWWString&);
RWBoolean
operator==(const RWWString&, const RWWString&);
RWBoolean
operator!=(const RWWString&, const wchar_t*  );
RWBoolean
operator!=(const wchar_t*,   const RWWString&);
RWBoolean
operator!=(const RWWString&, const RWWString&);

論理等値演算子と、論理非等値演算子。大文字と小文字は区別します (exact)。

RWBoolean
operator< (const RWWString&, const wchar_t*  );
RWBoolean
operator< (const wchar_t*,   const RWWString&);
RWBoolean
operator< (const RWWString&, const RWWString&);
RWBoolean
operator> (const RWWString&, const wchar_t*  );
RWBoolean
operator> (const wchar_t*,   const RWWString&);
RWBoolean
operator> (const RWWString&, const RWWString&);
RWBoolean
operator<=(const RWWString&, const wchar_t*  );
RWBoolean
operator<=(const wchar_t*,   const RWWString&);
RWBoolean
operator<=(const RWWString&, const RWWString&);
RWBoolean
operator>=(const RWWString&, const wchar_t*  );
RWBoolean
operator>=(const wchar_t*,   const RWWString&);
RWBoolean
operator>=(const RWWString&, const RWWString&);

比較は、辞書式順序でバイトごとに行われます。大文字と小文字は区別します (exact)。ロケールの区別にはメンバー collate()strxfrm() を使用します。

RWWString
operator+(const RWWString&, const RWWString&);
RWWString
operator+(const wchar_t*,   const RWWString&);
RWWString
operator+(const RWWString&, const wchar_t*  );

連結演算子。

ostream&
operator<<(ostream& s, const RWWString& str);

ostream sRWWString を出力します。str の各文字はまず複数バイト文字に変換され、その後 s に書き込まれます。

istream&
operator>>(istream& s, RWWString& str);

str.readToken(s) を呼び出し、入力ストリーム s からトークンを読み込みます。

RWvostream&
operator<<(RWvostream&, const RWWString& str);
RWFile&
operator<<(RWFile&,     const RWWString& str);

仮想ストリームまたは RWFile に文字列 str を保存します。

RWvistream&
operator>>(RWvistream&, RWWString& str);
RWFile&
operator>>(RWFile&,     RWWString& str);

仮想ストリームまたは RWFile から str にワイド文字の文字列を復元し、str の以前の内容を書き換えます。

関連の大域関数

RWWString
strXForm(const RWWString&);

::wsxfrm() で変換した文字列を返します。RWWString::collate() よりも高速に照合できます。

RWWString
toLower(const RWWString& str);

str の大文字をすべて小文字に変えたものを返します。標準 C ライブラリ関数 towlower() を使用します。

RWWString
toUpper(const RWWString& str);

str の小文字をすべて大文字に変えたものを返します。標準 C ライブラリ関数 towupper() を使用します。