土 - みる会図書館


検索対象: プログラミング言語C++
891件見つかりました。

1. プログラミング言語C++

1 10 第 3 章式と文 inline name* insert(const char* s) { return 100k ( s ′ 1 ) ′ 表そのものは単に , 型 na 爪 e のオプジェクトへのポインタの配列である : メンバの next は , 表の中で名前をつなげてまとめるのに用いられる . double value ー name* next ー char* string; struct name { 前述のように , 表の項目は以下のような型を持っ : const TBLSZ ている ( 同じハッシュコードを持つ名前はつなげてまとめられている ) : 表の中で名前についての項目を見つけるのに , 100k ( ) は簡単なハッシュコードを用い 自明な table の宣言でも適切な初期設定を保証してくれる . すべての静的オプジェクトは , デフォルトでゼロに初期設定されているので , name* tab1e[TBLSZ] ー このような int 土土 const char* pp while (*pp) ii if ( 土土く 0 ) 土土 ii = TBLSZ; P ー 土土 < く 1 / / ハッシュ *pp 十十一 すなわち , 入力文字列 p の各文字が , 排他的論理和によりⅱ ( 以前の文字の " 和 " ) に " 加え " られる . x y の中のビットは , オペランド x と y の対応するビットが異なるとき だけセットされる . 文字で排他的論理和を取る前に土土を左に 1 ビットシフトして , その 1 バイトしか使わないということを避ける . 土土くく = 1 : *pp 十十一 を使うと + を使うよりも少しばかり良くなる . コードを得るのに本質的である . 次の文 : これは次のように表すこともできる : どちらの場合も , シフトは妥当なハッシュ if ( 土土く 0 ) ii 土土 = TBLSZ;

2. プログラミング言語C++

83 template<class T> T S1ist<T>: :get( ) リストテンプレート 343 T1ink<T>* lnk lnk—>info; delete lnk; return 土ー (TIink<T>* ) slist base: : get ( S1ist の用法は lslist と同じくらい簡単である . 違いは , 最初に sl 土 nk からそのク ラスを派生させることなく S1ist 上にオプジェクトを持っことができることと , 二つの リスト上に一つのオプジェクトを持っことができるということである : void f(int 土 ) S1ist<int> lstl; S1ist<int> 1st2; lstl . 土 nse て t ( 土 Ist2. 土 nse て t ( 土 int int 土 1 土 2 lstl . get(); lstl . get ( しかしながら , 工 sl 土 st のような侵入的リストは , 実効時の効率において , 及び , ほとん どの場合にコンバクトさにおいて一定の強みを持つ . S1ist にオプジェクトを置くたび リストは TI 土 nk オプジェクトの領域を割り当てる必要がある . S1ist からオプジェ クトを取り去るたびに , リストは TI 土 nk オプジェクトの領域を解放する必要がある . そ れぞれの場合 , T がコピーされる . オーバーヘッドが問題となる場合は , 二つのことをす ることができる . 第一に , TIink は , 5.5.6 に記述されているような最適に近い特殊用 途の領域割り当て子の主なイ甫である . これは , ほとんどの場合 , 容認できる所まで実行 時のオーバーヘッドを減少させるだろう . 第二に , 侵入的な。一次リスト (primary list)" にオプジェクトを入れ , いくつかのリストに入っている必要がある場合に限り非侵入的リ

3. プログラミング言語C++

204 第 5 章クラス table: :—table( ) 0 ー i<size; i 十十 ) { fO て (int i name* nx ・ for ( name* n = tbI [ 土 n ー n=nx ) n—>next ー delete[ ] n—>string; delete n; delete tb1 ー name* table: :look(const char* p, int ins) ( .1.3 ) とほとんど同一である : タを宣言することにより得ることができる . 検索関数は , 卓上計算機の例で使われたもの table: :—table( ) のもっと簡単できれいなバージョンは , クラス na 爪 e にデストラク int 土土 char* pp = p; while (*pp) ii if ( ii く 0 ) 土土 土土 = size; 土土 < く 1 *pp 十十一 for (name* n=tbl[ii]; n; n=n—>next) if (strcmp(p,n—>string) 0 ) return n ー if (ins name* nn 0 ) error ( "name not found" new name ー nn—>string = new char[strlen(p) 十 1物 strcpy(nn—>string ′ p) : nn—>value tbl[ii]; nn—>next tbl は土 ] return nn;

4. プログラミング言語C++

4.2 リンケーン 147 / / f 土 le 1 . c : struct extern / / f 土 1e2 . c : struct S { int a ー char b ・ ▽ 0 土 d f(S*); S { int a ー char b ・ void f ( S ☆ p ) { / ☆ 同義語ーすなわち , typedef 名ーはそのファイルに局所的なので , 次の二つのファイ 大域的 inl 土 ne 関数は内部リンケージを持つので , デフォルトで const が付く . 型の となりかねないこと , に注意すべきである . 力を超えていること , そして矛盾するクラス宣言が検出されなければ , 微妙なエラーの源 このような重複したクラス宣言のチェックは , ほとんどの C + + のコンバイルシステムの能 ルでの宣言は , 互いに邪魔をしない : / / f i 1e 1 . c : typedef int T ー const int a inline T f(int 土 ) / / f 土 1e2 . c : typedef ▽ 0 土 d T; const int a inline T f(double { return 土十 a ー d) { cout<<d; } const には , 明示的な宣言により外部リンケージを与えることができる : こで g ( ) は 7 7 を印字する . void 9 ( ) { cout<<a; } extern const int a; / / f 土 1e4 . c : 7 7 ー const int a extern const int a; / / f 土 1e3 . c :

5. プログラミング言語C++

2.6 スペースの節約 95 時には共用体は " 型変換 " のために用いられる ( これは主に型変換機能のない言語で訓 練されたプログラマによりなされる . この場合 , ごまかしが必要になる ) . 例えば VAX 上では土 nt 型と土 nt * 型を , 単純にビットごとの同値性を仮定することにより土 nt 型を 土 nt * 型に、、変換”できる・ struct fudge union { int int* fudge a; 4 0 9 5 ー P ー / / 悪い用法 int* p = a ・ p ー しかしながら , これは実際には全く変換ではない . マシンの中には int 型と土 nt ☆型が 同じ大きさのスペースを占めないものもあるし , 整数が奇数アドレスを持てないものもあ る . 共用体のこういった用法は移植性がないし , 型変換を記述するためには明示的で移植 性のある方法がある ( 3.2.5 ) . 場合によっては , 型変換を避けるために共用体が故意に用いられる . 例えばポインタ 0 の表現を見つけるために fudge を使ってもよい fudge ・ p = 0 ー fudge . 土ー int 土 / / 土は 0 である必要はない 共用体に名前を付けること , すなわち , 共用体をそれ自身で型であるようにすることも できる . 例えば , fudge は次のように宣言できる : union fudge { int 土ー int* p; それに , 前と全く同様に ( 誤った ) 用法もできる . んとした用法もある . 5.4.6 を見られたい . しかしながら , 名前付き共用体にはちゃ

6. プログラミング言語C++

10.3 入力 439 istream や ostream のメンバ関数によって処理される型であれば不変である ) . 状態 fail( ) と bad( ) の間の違いは微妙であり , 町祭のところ関心を引くのは入力演算の実 装者に対してのみである . 状態 fa 土 1 ( ) では , ストリームが汚されておらず文字が失われ ていないことが仮定される . 状態 bad( ) では , すべての賭けは外れる . これらの状態を表現するのに用いられる値もクラス i 。 s で定義される : CIass 土 OS { public : enum 土 0 state { 900db 土 t = 0 ′ eofbit=l ′ fai1bit=2 ′ badbit=4 ′ 1 す - / ′ ビットの値は実装に依存しており , こでは構文的に正しくないコードを示すのを避ける ためにのみ示されている . ストリームの状態は次のように調べることができる : switch (cin. rdstate( ) ) { case 土 OS : : goodbit : / / cin 上の最後の演算が成功した break; case 土 OS : :eofbit: / / ファイルの最後 break; case 土 os : :failbit: / / ある種の整形工ラー / / おそらくそれほど悪くない break; case 土 os : :badbit: / / おそらく cin の文字が失われている break; より古い実装では状態変数に大域名が用いられていた . これは望ましくない名前空間の汚

7. プログラミング言語C++

3.1 卓上計算機プログラム 111 #include く string. h> こで完全な関数を示す : る ) 演算子である . は土土が最後には 0 .. TBLSZ—I の範囲にあることを保証する . 宅は法 ( 剰余とも呼ばれ name* 100k ( const char* p, int ins int 土土 const char* while (*pp) if ( 土土く O ) 土土 = TBLSZ; PP 工工 工 1 P ー 土土 < く 1 fO て (name* n=table[ii]; *pp 十十一 n; n=n—>next ) if (strcmp(p ′ n—>string) 0 ) return n; if (ins name* nn 0 ) error ( "name not found" new name ー / / ハッシュ / / 探索 / / 挿入 nn—>string = new char[strlen(p) 十 1] : strcpy(nn—>stringrp); nn—>value nn—>next table[ii] return nn; table[ii]; ハッシュコード ii が計算された後 , 名前は next フィールドをたどる単純な探索で見 つけられる . 各 name は標準的な文字列比較関数 strcmp ( ) を用いてチェックされる . 文 字列が見つかればその name が返される . そうでなければ新しい name が加えられる . name を加えることには , new 演算子 03.2.6 を見られたい ) を用いて自由記憶領域上 に新しい name オプジェクトを作成すること , それを初期言殳定すること , 名前のリストに それを加えること , が含まれる . 最後のことはリストの先頭に新しい名前を置くことによ り行われる . というのは , これならリストが存在するかどうかのテストすらしなくても行 うことができるからである . 名前のための文字列も自由記憶領域に格納されなければなら ない . 関数 strlen( ) はどれだけの記憶領域が必要かを調べるのに用いられ , new はそ

8. プログラミング言語C++

124 第 3 章式と文 CIass iOS { public : enum iO state { 900db 土 t = 0 ′ eofbit=l ′ fai1bit=2, badbit=4 ストリームの状態は次のようにリセットできる : i0S : : goodbit : cout . state goodbit といった名前がユーザの定義する名前の邪魔をするのを避けるために io state の定義が土 os クラスに入れ子になっているので , 接頭辞土 os : : が必要である . ストリームがおかしくなっているか又は演算が失敗した , というのは次のようにテスト することができる : if (cout. state& ( 土 os : :badbit ー土 os : : failbit) ) / / stream が良くない はりも & の方が優頂序が高いので余分な括弧が必要である . 関数は入力の最後に達すると , そのことを次のように報告できる : cin. state ー = ios : :eofbit; 演算子トが使われているのは , すでにストリームがおかしくなっているかもしれない ( す なわち , state==ios : :badbit) ので 土 OS : :eofbit; Cin . state だとその状態がクリアされてしまうからである . 二つのストリームの状態の異なる点は , 次のようにすれば見ることができるだろう : 土 OS : : 土 0 state diff = cin. stateAcout . state; iO state 型については , こういった違いはそれほど有用ではないが , 他の同様の型に ついては大変有用である . 例えば , 処理している割り込みの集合を表現するビットべクタ と , 処理を待っている割り込みの集合を表現する別のビットペクタとを比較することを考 えてみよう .

9. プログラミング言語C++

10.4 整形 447 CIass 土 OS { public : / / 書式制御のフラグ : enum { skipws=OI ′ left = 02 ′ right=04, internal= 010 ′ / / 入力の空白類を飛ばす フィールドの調整 : / / 値の後の詰め込み 値の前の詰め込み / / 符号と値の間の詰め込み / / 整数の基数 : / / 10 進 / / 8 進 / / 16 進 / / 基数を示す / / 後に連なるゼロを印字する ′ x ′より′ E ′ / / 正の int に明示的な′ + ′ / / 浮動小数点記法 : sc 土 ent 土 f 土 c = 04000 ′ . dddddd E dd fixed = 010000 ′ dddd . dd / / 出力をフラッシュする : / / 各出力演算の後 / / 各文字の後 dec = 020 ′ oct = 040 ′ hex = 0100 ′ showbase=0200, showpo 土 nt = 0400 ′ uppercase=01000 ′ showpos = 02000 ′ unitbuf=020000, std 土 0 = 040000 フラグの意味は以下の小節で説明される . フラグの値は実装にイ衣存しており , こでは構 文的に正しくないコードを示すのを避けるためにのみ示されている . インタフェースをフラグとそれらを設定したり解除したりするための演算として定義す ることは , いくらか古い流儀の技法とはいえ由緒のあるものである . その主な美点はユー ザがオプションの集合を合成できることである . 例えば : const int my_io options 土 OS : :left ー土 OS : :oct ー ios: :showpointlios: :fixed; このようなオプションの集合は , 単一の演算 cout . flags (my_io_options );

10. プログラミング言語C++

2.3 型 71 2.3.6 配列 型 T に対して T [ s 土 ze ] は。。型 T の s 土 ze 個の要素の配列 " 型である . 要素はゼロか ら s 土 ze ー 1 までインデックスが付けられている . 例えば : / / v [ 0 ] ′ v [ 1 ] ′ v [ 2 ] の 3 個の float から成る配列 float v [ 3 / / 5 個の int から成る配列が 2 個 int a [ 2 Ⅱ 5 ]; / / 32 個の文字ポインタから成る配列 char* vpc[32 ]; 小文字の整数値を書き出すループは次のように書くことができる : extern "C" int strlen(const char*) ー / / く string. h> より char alpha [ ] " abcdefghi j klmnopqrstuvwxyz " main( ) strlen(alpha); int S 2 ( int 土 = 0 ー土く sz ー土十十 ) { for alpha [ 土 char ch cout くく int(ch) くく 0 " くく oct ( ch ) くく 0 x " くく hex ( ch ) くく くく 関数 oct( ) は整数引数の 8 進表示を返し , 関数 hex( ) は整数引数の 16 進表示を返 す . oct( ) と hex( ) は < 土 ostrea Ⅲ . h > で宣言されている . <st て土 ng. h > から関数 strlen( ) が alpha の中の文字数を数えるのに用いられていた . 別法としては , alpha の大きさを使うこともできただろう ( .4.4 ) . ASC Ⅱ文字集合を用いているならば出力 は次のようになるだろう : 0141 0X61 9 8 014 2 0X62 9 9 014 3 0X63 配列 alpha の大きさを指定する必要がないことに注意されたい . コンバイラは初期設定 子として指定された文字列の文字数を数える . 文字の配列の初期設定子として文字列を用 cd ..Q O