2014年3月21日金曜日

C++ 標準テンプレートライブラリ 其の弐(2/2)





第二弾は、イテレータ(反復子)の話です。


イテレータとは、コンテナオブジェクトにある


 iterator クラスのオブジェクトで



これを使うと、コンテナオブジェクトの中のデータに同じように

アクセスできるようになります(^^;)

つまり、配列でもリストでも同じアクセス方法になる、ということです。

iterator オブジェクトは、各コンテナオブジェクト用のものがあり、

その中の1つの要素を指します。

では、いつものようにサンプルプログラムです。

#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    vector<int> nVec;

    nVec.push_back(5);
    nVec.push_back(10);
    nVec.push_back(15);
    nVec.push_back(20);

    // vectorクラスでイテレータを使う場合の宣言方法に注目
    vector<int>::iterator itr_first, itr_last, i;

    itr_first = nVec.begin();  // 最初の要素をイテレータに代入
    itr_last = nVec.end();     // 最後の要素をイテレータに代入

    cout << "要素数は " << (int)nVec.size() << " です。" << endl;

    cout << "すべて出力してみます。" << endl;
    // 要素を取り出すのにイテレータでカウンタを操作
    for (i = itr_first; i != itr_last; i++) {
        cout << *i << endl;    // イテレータから値を参照しています。
    }                               // ポインタのようですね(^^;)

    return 0;
}

実行結果
# ./test
要素数は 4 です。
すべて出力してみます。
5
10
15
20


このように、ちょっと使うだけでもSTLの素晴らしさが分かります(^^)

開発を効率化する便利なものはどんどん使ってものです...


今日の名言
一年前にあなたが悩んでいた事柄を思い出していただきたい。どうやってそれを
切り抜けただろうか。そうした悩み事ばかり気にかけて、エネルギーを
浪費しなかっただろうか。結局そうした悩みは、ほとんどが取り越し苦労だった
のではないか?
                               デール・カーネギー

今日行いたい善行があれば、すぐに実行せよ。決して明日まで延ばすな。
                               ジェフリー・チョーサー

現在我々が経験している時間と状況は、それまでの時間と状況が積もり積もって
出来た結果である。これは大自然がこれまでに振り出した、あるいは
振り出すことのできる、最上の賽の目である。
                               ラルフ・ワルド・エマーソン

何より大事なことだが、我々は現在にしか生きられないのだ。過去を顧み、
人生の一瞬たりとも無為に過ごしたことはなかったと言いきれる者は、
最も幸福な人間である。
                               ヘンリー・デイヴィッド・ソロー

2014年3月14日金曜日

C++ 標準テンプレートライブラリ 其の壱(1/2)






今回はC++の標準テンプレートライブラリ

Standard Template Library についての話です。






標準テンプレートライブラリとは、配列、リスト、キューのような複数のデータを

管理したい場合に、その実装に頭を悩ませることなしに利用できる

大変便利なクラスやアルゴリズムの集合です。(^^)

また、複数のデータを格納して管理するオブジェクトのことを

コンテナオブジェクトといいます。

一例として次のようなものがあります。

  • 配列      vector
  • リスト     list
  • キュー    queue
  • スタック  stack
  • 集合      set

まだ、他にも色々ありますが、ここで全て扱うには難しい内容ですし

割愛させていただきます...(^^;)

あれこれ難しいことを考える必要がないし、汎用的で高機能という

素晴らしさを兼ね備えているのですが、メモリ制約がある組み込み

ソフトウェア開発においては、当然使えません...(-_-;)残念

そんなわけですが、例によって簡単なプログラムを用意しました。

今回は、vectorクラスを使ってみます。(^^)

これのスゴいところは、メモリが足りない時に自動的にメモリを

確保することです。

#include <iostream>    // vectorクラスを使います
#include <vector>

using namespace std;

int main(void)
{
    vector<int> nVec;    // int型のvectorオブジェクトを生成

    nVec.push_back(5);    // データを格納しています...
    nVec.push_back(10);
    nVec.push_back(15);

    // これで要素のサイズが分かります
    cout << "要素数は " << (int)nVec.size() << " です。" << endl;
 
    // 中身を確認してみましょう
    for (int i = 0; i < (int)nVec.size(); i++) {
       // 通常の配列と同じようにアクセスできます:-)
        cout << "vectoro[" << i << "] = " << nVec[i] << endl;
    }

    return 0;
}

実行結果
# ./test
要素数は 3 です。
vectoro[0] = 5
vectoro[1] = 10
vectoro[2] = 15


最初に配列の要素を決めなくてよいとは、何と便利...

しかも、動的にメモリ確保してることを全く意識させませんね。

いやぁ、STLを使えるってホントに素晴らしいですね(^-^)


今日の名言
結局のところ、最悪の不幸は決して起こらない。たいていの場合、
不幸を予期するから悲惨な目に合うのだ。
                           オノレ・ド・バルザック

一日を顧みて、どこかおもしろかった、楽しかった、本当に満足だったという
ところがなければ、その一日は無駄に過ごしたことになる。私にとって、
それは神に背くことであり、よこしまなことなのだ。
                           ドワイト・D・アイゼンハワー

最悪の事柄を受け入れてしまえば、もはや失うものはなくなる。
裏を返して言えば、どう転んでも儲けものなのだ!
                           デール・カーネギー

時間を浪費するな、人生は時間の積み重ねなのだから。
                           ベンジャミン・フランクリン

2014年3月5日水曜日

C++ テンプレートクラス





テンプレートクラスとは、使用する型を
曖昧な状態で定義しておくクラスです。


テンプレートクラスの機能を使うことで、
複数の型に対応することができます。(^^)




// 三辺の長さから、三角形の面積を求めるクラス
template<class T>  // T はテンプレート引数です(^^;)
class Triangle {
public:
    Triangle(T a, T b, T c) {
        m_a = a;
        m_base = b;  // 辺b を底辺としよう(^^;)
        m_c = c;
    }
    T GetHeight() {
        return ((m_a + m_base + m_c) / 2) * 2 / m_base;
    }
    T GetSummation() {
        return (m_a + m_base + m_c) / 2;  // ヘロンの公式
    }

    T m_a, m_base, m_c;
};

テンプレートクラスのオブジェクトを生成する場合は、次のように
使用する型を指定します。

Triangle<int> IntTriangle;             // int型を指定します
Triangle<double> DoubleTriangle;  // double型を指定します

また、テンプレート引数が二つ以上ある場合は、次のように
複数指定します。

template<class T1, class T2> // テンプレートなだけにT1, T2
class Triangle {
    :
};
    :
Triangle<int, double> tri;  // int型、double型を指定します
    :

それでは、今回のサンプルプログラムです。
#include <iostream>

using namespace std;

template<class T>  // T はテンプレート引数です(^^;)
class Triangle {
public:
    Triangle(T a, T b, T c) {
        m_a = a;
        m_base = b;
        m_c = c;
    }
    T GetHeight() {
        return ((m_a + m_base + m_c) / 2) * 2 / m_base;
    }
    T GetSummation() {
        return (m_a + m_base + m_c) / 2;
    }

    T m_a, m_base, m_c;
};

int main(void)
{
    Triangle<int> tri1(59, 50, 100);
    cout << "a = 59, b = 50, c = 100" << endl;
    cout << "height = " << tri1.GetHeight() << endl;
    cout << "   sum = " << tri1.GetSummation() << endl;

    cout << "---" << endl;

    Triangle<double> tri2(12.3, 45.6, 78.9);
    cout << "a = 12.3, b = 45.6, c = 78.9" << endl;
    cout << "height = " << tri2.GetHeight() << endl;
    cout << "   sum = " << tri2.GetSummation() << endl;

    return 0;
}

実行結果
# ./test
a = 59, b = 50, c = 100
height = 4
   sum = 104
---
a = 12.3, b = 45.6, c = 78.9
height = 3
   sum = 68.4

うーん、書いておいてなんですが合っているのかどうかが
分からないですね...(-_-;)

ちなみに、面積を求めるときのヘロンの公式をググったときに
面積 S とあったのですが、ふとこの S が何の略か気になり
これもまたググったところ、数学界の定説は

和を表すsumあるいはsummationの頭文字

とのことです。

surface じゃなかったんだ...|д゚)


今日の名言
今日気にかかることで、明日も気にかかることはめったにない。だから夜、
床につく時、たいていの悩みに対しては、安心してこう言い聞かせられる。
「お前には全力を尽くした。今後もう会うことはあるまい」
                          ウィリアム・クーパー

私は未来のことを考えない。あっという間にやってくるからだ。
                          アルバート・アインシュタイン

神の到来を待ち望む者は、自分が神の御手の中に現在いることが
分からない。神と幸福は不離一体であるという信念を抱いて、あらゆる
幸福を現在のこの一瞬の中に注ぎ込むことだ。
                          アンドレ・ジード

落し物の広告。昨日、日の出から日の入りの間のどこかで、それぞれ
六十分のダイヤモンドをちりばめた貴重な時間を二つ紛失。
なお拾い主には賞金なし。永遠に失われしゆえ。
                          ホレス・マン