プログラム豆知識

Last-modified: 2010-11-11 (木) 16:45:18

boost関係のサイトまとめ

Boost C++ Libraries本家サイト
Let's Boost 基本的なことはここを参照すれば大概の事が出来る.また本家サイトのリンクもあるので深く知るときにも役に立つ.

山田家のチラシの裏

openCV の動画読み込みでaviの形式でどれが使えるか忘れてたので,
動く形式がわかったので,ここの残しておく
"avi DivX Video"


  • Linux(ububtu)とvc++の文字の取り扱いの違い
    "ESC"のaciiコードがvc++では"0x1b"になるが,Linuxでは少し変わる.(たしか"0x101b"な感じになった.)
    文字コードを合わせる方法として次のやり方が簡単

    " 0x1b & 0xff "

上記の方法だと" 0x1b & 0xff = 0x1b " " 0x101b & 0xff = 0x001b = 0x1b"になるのであわせることができる.

  • 数字のシャッフルについて

    for( int i=0; i< size; ++i){

    int tmp;

    int rn = randam(0,size);// rn の値の範囲が[0,size)とする

    swap( val[i], val[rn]);

    }

上の実装ではシャッフルの数に偏りがでる.正確には次のようにする.

for( int i=0; i< size-1; ++i){

int tmp;

int rn = randam(i,size);// rn の値の範囲が[i,size)とする

swap( val[i], val[rn]);

}

これは,数の選び方が前者ではsize^sizeの組み合わせがあり,size>=3のとき実際の並べ方の順列 size!で割り切ることができないので数字の並び方に偏りが出ることになる.
ゆえに後者のように数字の選び方をsize!にすれば偏りのないシャッフルができる.

  • for文のインクリメントについて
    for(int i=0; i<size; i++);
    より
    for(int i=0; i<size; ++i);
    のほうが意味合い的にも,効率的にもいいそうだ.gcc だとしたの方が高速で動くそうですよ.
    特にオブジェクト系でインクリメントをする際,後置インクリメントでは無駄にオブジェクトを作ってしまうのでよくないそうですよ.
  • CUI上の簡単なアニメーション.
    繰り返し系に組み込むと楽しむことができるが,描画するため効率はガタ落ちする.またlinuxでは豊富なエスケープシーケンスによって複数行にわたるアニメーションも可能になる.

    switch ( AA_num){

    case 0:

    printf(" ( ゚∀) キタ━ッ!!\r");

    break;

    case 1:

    printf(" ( ゚)キタ━━━ッ!!\r");

    break;

    case 2:

    printf("    キタ( )━━━━ッ!!\r");

    break;

    case 3:

    printf("   キタ━(゚ )━━━━ッ!!\r");

    break;

    case 4:

    printf("  キタ━━(∀゚ )━━━━ッ!!\r");

    break;

    case 5:

    printf("キタ━━━━(゚∀゚)━━━━ッ!!\r");

    AA_num = 0;

    break;

    }

    AA_num++;

スマートポインタについて

newでメモリの領域を確保すればdeleteする必要があります.
しかし,deleteは忘れることもあるし,いちいちdeleteするのも面倒くさいです.
そんなときスマートポインタを使用すれば勝手にdeleteしてくれるようになります.
ここでは適当にboostを使った例だけ紹介します.int型の領域を確保します.

#include <boost/shared_ptr.hpp>

//using namespace boost;はしない

int main(void)

{

 //スマートポインタなし

   int* a;

   a = new int();

   //ここでいろいろ作業

   delete a;

 

 //スマートポインタあり

   boost::shared_ptr<int> b;

   b = boost::shared_ptr<int>(new int());

   //ここでいろいろ作業

  

 return 0;

}

配列の場合はちょっと違います.delete[]に対応するのはshared_arrayになります.適当にint5個分確保します.

#include <boost/shared_array.hpp>

//using namespace boost;はしない

int main(void)

{

 //スマートポインタなし

   int* a;

   a = new int[5];

   //ここでいろいろ作業

   delete[] a;

 

 //スマートポインタあり

   boost::shared_array<int> b;

   b = boost::shared_array<int>(new int[5]);

   //ここでいろいろ作業

 

 return 0;

}

ちょっと応y用.OpenCVでIplImage*を扱ったりする場合.

boost::shared_array<IplImage> image =
あれ?ちょっと確認しないと分からない.

※本来はガベージコレクションと呼ばれる機能で,javaのようなオブジェクト指向言語にはデフォルトで備わっています.
あとは適当にググってください.