MISTコンテナの操作 - mist-team/mist GitHub Wiki
本チュートリアルでは,MISTコンテナにデータを挿入して,STLのアルゴリズムを適用してみましょう. 具体的には,double 型の1・2・3次元配列に対して,STLのソートアルゴリズムを適用してみます. 入力するデータは何でも良いのですが,今回はMISTで提供している乱数ルーチンを利用してみることにします.
MISTのコンテナの使い方 でも説明したように,MISTの基本的なコンテナを利用するためには,次のヘッダをインクルードします.
#include <mist/mist.h>
今回は,さらに乱数を利用するので次のヘッダもインクルードします.
#include <mist/random.h>
必要なヘッダファイルのインクルードが終わったら,値を入れるコンテナを準備しましょう. 今回は,コンテナの要素が double 型となるので,array を利用して1次元配列を作成,簡単な実験用に要素数は 5 くらいにしておきましょう.
mist::array< double > data( 5 );
コンテナの準備ができたら,値の代入です. まずは,実験のために適当に値を代入してみます.
data[ 0 ] = 3.0;
data[ 1 ] = 1.0;
data[ 2 ] = 5.0;
data[ 3 ] = 2.0;
data[ 4 ] = 3.5;
STLでは,比較的性能の良いソートアルゴリズムを提供しています(qsortなんかよりは速い). 実際に使うときには次のヘッダファイルをインクルードします.
#include <algorithm>
STLが提供するソート関数は,std::sort という呼び出しで,入力引数は次のようになります.
std::sort( 要素の先頭を指すイテレータ, 要素の終わりを指すイテレータ, 比較関数←省略可 );
MISTのコンテナに対してこの関数を適用する場合には次のようになります.
std::sort( data.begin( ), data.end( ) );
今回のデータでは,予想される出力は 1.0, 2.0, 3.0, 3.5, 5.0 となるはずです. では,実際のソート結果を次のようにしてコンソールに出力してみましょう.
std::cout << data << std::endl;
#include <iostream>
#include <mist/mist.h>
#include <mist/random.h>
#include <algorithm>
int main()
{
mist::array< double > data( 5 );
data[ 0 ] = 3.0;
data[ 1 ] = 1.0;
data[ 2 ] = 5.0;
data[ 3 ] = 2.0;
data[ 4 ] = 3.5;
std::cout << "ソート前: " << data << std::endl;
std::sort( data.begin( ), data.end( ) );
std::cout << "ソート後: " << data << std::endl;
return( 0 );
}
MISTで提供する乱数生成関数には2種類あり,一様乱数と正規乱数の2種類です. 今回はそのうちの一様乱数を使用してみます. 乱数の発生方法はこんな感じです.
mist::uniform::random rnd;
/// [0,1]区間浮動小数点の一様乱数の発生
rnd.real1( );
ちなみに,シードを指定して乱数を初期化する場合は次のように書きます.
mist::uniform::random rnd( std::clock( ) /* 時刻によってシードが変わるようにしてみた */ );
では,コンテナに乱数データを代入してみましょう.
for( size_t i = 0 ; i < data.size( ) ; i++ )
{
data[ i ] = rnd.real1( );
}
表示の方法は,簡単な実験で行った方法と同じです. ちゃんと結果が得られるかを確認してみてください.
#include <iostream>
#include <mist/mist.h>
#include <mist/random.h>
#include <ctime>
#include <algorithm>
int main()
{
mist::array< double > data( 5 );
mist::uniform::random rnd( std::clock( ) );
for( size_t i = 0 ; i < data.size( ) ; i++ )
{
data[ i ] = rnd.real1( );
}
std::cout << "ソート前: " << data << std::endl;
std::sort( data.begin( ), data.end( ) );
std::cout << "ソート後: " << data << std::endl;
return( 0 );
}