2009-08-01から1ヶ月間の記事一覧

簡単なSTLアルゴリズム

C++

http://www.geocities.jp/ky_webid/cpp/library/016.html STLには様々なアルゴリズムが存在します。STLのアルゴリズムは、STLに用意されている各種コンテナの各要素を対象とするように作られた、グローバルなテンプレート関数です。コンテナの種類ごとにメン…

変数定義時に引数無しのコンストラクタを呼んではならない

ロベールのC++入門講座 06-04まず引数ありのコンストラクタを持つクラスを定義する場合 #include <iostream> using namespace std; class CSample { public: CSample (int num) {} }; int main () { CSample obj(100); return 0; } obj(100)のようにして引数を渡すこと</iostream>…

例外を発生させないnew(nothrow)演算子

ロベールのC++入門講座 05-15newでメモリを動的確保した場合、非常に稀ではありますがメモリ確保に失敗する場合があります。メモリ確保に失敗するとどうなるかは以前例外機構の勉強の時にチラッと出てきましたが、bad_allocという例外を発生させます。しかし…

トリグラフシーケンス

ロベールのC++入門講座 05-14別名「3文字表記」というC++の構文で使用される記号の代価記号のこと。例えば「{」は「?? #include <iostream> using namespace std; int main () ??< cout << "aaaa" << endl; return 0; ??> $ main aaaaなんか凄いですねこれ。ちゃんとコ</iostream>…

関数オブジェクト(ファンクタ)

C++

http://www.geocities.jp/ky_webid/cpp/library/015.html関数オブジェクトのお話です。パッと見はややこしそうですが、なんとかなると思います。まずは関数オブジェクトが単なる()演算子のオーバーロードであることを理解した上で、実装してみます。 #includ…

int i;とint(i);が違う挙動になるケース

C++

http://d.hatena.ne.jp/pknight/20090817/1250503320 http://d.hatena.ne.jp/pknight/20090817/1250505682 の続きです。色々試していて違いがある場合があったので記録。というかまだC++の基礎学習してる最中なのに何だか変に深いところまで覗き込んでしまっ…

RVOによるコピーコンストラクタの最適化

C++

前回の記事でコメント欄にてRVO(Return Value Optimization)というものを教えていただきました。要はコンパイラが最適化してオブジェクトへの代入なのにコピーコンストラクタを通さずにそのまま代入できるようにしてくれるものです。使い方は簡単です。クラ…

文字列リテラルの型

ロベールのC++入門講座 05-13文字列リテラルの型は正確にはconst char型の配列だそうです。てっきりポインタ型だと思っていました。自分の目で確認するため、sizeofしてみました。 #include <iostream> using namespace std; int main () { cout << sizeof("foo bar ba</iostream>…

int();とint(i);とint(1);の違いについての謎

C++

int i;とint(i);の違いについて - (void*)Pないと の続きです。括弧ありとなしで同じかと思ったんですが、どうも渡す引数によって挙動が変わるようです。とりあえず以下の例を。 int main () { int(); int(i); int(100); return 0; } これらは全て問題なくコ…

int i;とint(i);の違いについて

C C++

色々勉強したり試したりしてて分からないことがあったので記録。以下のようなコードなのですが int main () { int(i); int j; return 0; } CでもC++でも問題なく動きます。つまりこれは変数宣言する際に、括弧で囲っても囲まなくてもまったく同じ意味になる…

ストリームイテレータ

C++

http://www.geocities.jp/ky_webid/cpp/library/014.html出力や入力に対してイテレータを使って値のやり取りができます。そのようなイテレータのことをストリームイテレータを言うようです。まずは出力ストリームの動作を確認してみます。 #include <iostream> #includ</iostream>…

挿入イテレータ

C++

http://www.geocities.jp/ky_webid/cpp/library/013.html値の追加を行うことができるイテレータのことを挿入イテレータを言います。とりあえず実装してみます。 #include <iostream> #include <list> using namespace std; int main () { typedef list<int> listint; listint data</int></list></iostream>…

参照の戻り値に対して代入する

C++

メンバ関数に代入する - (void*)Pないとの時にも調べたのですが、メンバ関数に限らず戻り値が参照の場合にその関数を左辺値として扱うことができるようです。 #include <iostream> using namespace std; int& foo (int& num) { return num; } int main () { int num = </iostream>…

ちょっと今日も更新できそうにない

体調が悪くて何もできない。昨日飲みすぎたのか、はたまた歩きすぎたのか、頭がくらくらする。今日はゆっくり休むことにしよう。

イテレータで複数分先に進める(or戻る)方法

C++

通常イテレータでは++演算子を用いて一つ進めたりすることができます。 vector<int>::iterator it = data.begin(); // ひとつ進める ++it; では二つ以上進めたい場合どうするか? // 二つ進める ++it; ++it; とすればできますよね、当たり前の話です。でもこれが5</int>…

イテレータに関するあれこれ

C++

http://www.geocities.jp/ky_webid/cpp/library/012.htmllistやsetやmap等で使ってきたイテレータのことを双方向イテレータと言います。++演算子や--演算子で双方向に移動ができるからです。さらにこれに加えて[]演算子での直接アクセスできるvectorやdeque…

pairクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/011.html pairは、2つの値をペアにして1つとして扱うためのクラスです。 前章のmapでは、キーと値をペアで扱う必要がありました。正にこのような用途で使うものです。前章のmapで、insertするとき、value_ty…

mapクラスでキー名でアクセス

C++

http://www.geocities.jp/ky_webid/cpp/library/010.htmlmapクラスの続きです。mapクラスはツリー構造なので直接アクセスすることは通常出来ないのですが、キー名でアクセスすることはできるのでそれが[]演算子に割り当てられいます。ということで使ってみま…

mapクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/010.htmlmapクラスとはキーと値の組み合わせでデータを管理するためのクラスで、ちょうどハッシュテーブルの仕組みに似ているかもしれないものです。ただし内部のデータ構造としてはツリー構造らしいので、挙…

逆順のイテレータ

C++

さて今までvector、list、set等色々なコンテナの勉強をしてきたわけですが、全ての値にアクセスする手段としてイテレータを使ってきました。このイテレータなんですが、実は逆順でループさせることも可能なのです。さっそくやってみます。例としてvectorクラ…

multisetクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/009.html前回のsetクラスと殆ど同じです。setクラスは、同じ値を格納できませんでしたが、multisetクラスの場合は同じ値であっても格納できるようになります。まずはsetクラスで同値の格納を行った場合どうな…

setクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/009.htmlsetクラスとは、自動的に要素のソートを行ってくれるコンテナです。さっそく実装してみます。 #include <iostream> #include <set> using namespace std; int main () { set<int> data; data.insert(5); data.insert(3); d</int></set></iostream>…

bitsetクラスを自作する

C++

昨日勉強したbitsetクラスですが、題材としてとても面白そうだと思ったので自作してみることにしました。テンプレートクラスとビット演算に慣れるという意味でもちょうど良いと思います。 #include <iostream> #include <string> using namespace std; template<unsigned long SIZE> class mybitset</unsigned></string></iostream>…

listクラスでソートせずにリスト同士の連結

C++

前にlistクラスのmerge関数でリスト同士の連結をする方法を勉強しました。listクラスでリスト同士の連結 - (void*)Pないとですがmerge関数だと元のデータがソートされていた場合、連結後のデータも勝手にソートしてしまいます。ソートをせずに連結する方法を…

bitsetクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/008.htmlビット演算をオブジェクトとして扱えるようにするためのクラス。これは便利ですね。兎に角実装してみましょう。 #include <iostream> #include <bitset> using namespace std; int main () { // 8ビットのデータ bitset<</bitset></iostream>…

priority_queueクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/007.htmlpriority_queueとは優先順位付きキューのことです。pushするとソートされて要素が格納されるqueueといったところです。コンテナはデフォルトでvectorになっています。 #include <iostream> #include <queue> #include <vector> </vector></queue></iostream>…

queueクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/006.html前回のstackとほぼ同様です。queueクラスもデフォルトのコンテナにdequeクラスが指定されています。とりあえずlistクラスを指定して実装してみます。 #include <iostream> #include <queue> #include <list> using namespace </list></queue></iostream>…

stackクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/005.htmlstackですが、以前C言語の時に勉強したスタック構造を再現するためのクラスです。ぶっちゃけて言えば機能が限定されたvectorクラスとなんら変わらないと思います。ですが用途がハッキリしているので便…

dequeクラス

C++

http://www.geocities.jp/ky_webid/cpp/library/004.html読み方は「デック」だそうです。でどんなクラスなのかですが、とどのつまり配列の先頭に対しても挿入や削除が行えるvectorクラスという位置づけみたいです。ということで軽く実装してみます。 #includ…

listクラスでリストから要素の削除

C++

http://www.geocities.jp/ky_webid/cpp/library/003.htmllistクラスで確保したリストデータを削除するメンバ関数は結構あります。 pop_back()・・・末尾の要素を削除 pop_front()・・・先頭の要素を削除 erase()・・・イテレータによって指定された要素を削…