プログラムTIPS

DEMO PROGRAM ヘキサドライブでは様々な研究開発をしています。その一部を紹介。

突撃!STL!!(2008年10月27日)

今日は、STL(Standard Template Library)について書いてみたいと思います。
STLとは、C++の標準ライブラリにも含まれているコンテナや
アルゴリズムなどを含むライブラリのことです。
コンテナは、動的な配列やリスト、連想配列などのデータの入れ物。
アルゴリズムは、ソートやマージなどなど、上のコンテナに使うものです。
 
上手く使えば、短い時間で良いプログラムが書けてしまう便利なものです。
そこで、STLの機能を知っていて使おうかなと思っている方、もしくは使い始めたばかりの方向けに、コンテナの1つ、vectorについての小ネタを書いてみます。
 
それでは、小ネタに移ってみましょう。
 
1.ループの際に一時変数に入れるとお得
vectorは配列の代わりに使うことが多いため、下のようなループを書くことがあります。

void TestFunc(std::vector& dataVec)
{
    for( size_t i = 0; i < dataVec.size(); i++ ) {
        dataVec[i].get();

        //  何かの処理

        dataVec[i].set();
    }
}

ループの中身は、sizeメソッドの呼び出しを除いて普通の配列と同じかと思います。
でも、この見慣れたコードに対してデバッグを行うと見慣れないことが起きるかもしれません!!
 
環境によっては、デバッガで「dataVec[i]」の値を直接見ることが出来ない場合があるのです。
ちなみに、私の手元の環境では見れませんでした。
この状況を解決するため、以下の変更を加えてみました。

void TestFunc(std::vector& dataVec)
{
    for( size_t i = 0; i < dataVec.size(); i++ ) {
        Data&    data = dataVec[i];    // ここで一時変数に入れてます
        data.get();

        //  何かの処理

        data.set();
    }
}

これは、以前の日記で書かれていたことと同じ変更ですが、
今回は、デバッガで値が見れるようにもなります。
 
このコードをデバッガで動かすと、「dataVec[i]」の値は見れなくとも「data」の値は見ることが出来るため、中身の確認が出来るようになるというわけです。
1行追加することで意外な効果がありますね。
 
2.reserveメソッドでサイズの自動拡張を防ぐ

vectorには、push_backメソッドという、末端に要素を追加する便利な機能があります。
便利ではありますが、vectorには格納できる要素数を超えた場合、
自動でサイズを拡張する性質があるのでちょっと注意が必要です。
例えば・・・・

std::vector< int >    valueVec;
for( int = 0; i < 1000; i++ ) {
valueVec.push_back(i);
}

と書いた場合、ループを抜けるまでに複数回のサイズの拡張が行われることになります。
サイズの拡張とは、
 
・新しいメモリ領域の確保!!
・古いメモリから新しいメモリへのコピー!!
・古いメモリ領域の開放!!
  

が1セットとなって行われます。
うーーん、出来れば避けたいものです。
 
そこで、reserveメソッドを使って事前に格納できる要素数を増やしておきます。

std::vector    valueVec;
valueVec.reserve(1000);
for( int = 0; i < 1000; i++ ) {
    valueVec.push_back(i);
}

この変更を加えると、1000個までの要素を格納できるので、
ループの中でサイズの拡張が行われることはなくなります。
 
ちなみに、許容量を増やすだけなのでreserveメソッドを呼んだ直後の要素数は
0ということにご注意ください。
 
3.使わないという選択肢も忘れずに
ここまで書いておいてなぜ!!という気もしますが、使わないことも選択肢の1つです。
vectorは、通常の配列と同じ使い方が出来る上に、サイズの取得や
要素の追加・削除、動的な拡張などが行える便利な物です。
便利なだけに「まずは使ってみよう」と考えてしまいますが、
立ち止まってみて、本当に必要か考えてみるのも良いかもしれません。
 
初めから必要なサイズが固定とわかっているなら、普通の配列という選択肢がありますし、
要素の追加削除が頻繁に行われるならlistという選択肢もあります。
必要な機能と状況に合わせて、使うかどうかを決めてみてください。
 
STLのvectorを使おうと思っている方、使い始めた方、ちょっとは参考になったでしょうか?
機会があれば、他の機能についても触れてみたいと思います。

【免責事項】

本サイトが提供している情報に関しては、安全性等、いかなる保証もされません。 株式会社ヘキサドライブは、これらの情報をあなたが利用することによって生ずるいかなる損害に対しても一切責任を負いません。

【著作権】

本サイトが提供しているコンテンツについては、特に断りのある場合を除き、株式会社ヘキサドライブが著作権を有します。