boost
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
boostライブラリについて
-----
#contents
-----
*ライブラリ [#a989aab7]
**[[boost::bind:http://boost.cppll.jp/HEAD/libs/bind/bind...
個人的には一番よく使うのがboost::bind.
STLのbind1st, bind2stの汎用版である.任意の引数をbindして...
#include <boost/bind.hpp>
boost::bindは関数オブジェクトを作成することができるのだが...
例えば,
#code(C){{
int func2(int x, int y)
{
return x+y;
}
int func3(int x, int y, int z)
{
return x+y+z;
}
void main(void)
{
boost::function<int (int, int)> func;
func = func2;
cout << func(1, 2) << endl;
func = boost::bind(func3, _1, _2, 0);
cout << func(1, 2) << endl;
}
}}
のように,3引数を取る関数の最後の引数に渡す値を0に固定し...
また,下のboost::functionでも述べているが,メンバ関数につ...
#code(C){{
Class1 *obj = new Class1;
boost::function<int (int)> func = boost::bind(&Class1::Fu...
}}
**[[boost::mem_fn:http://boost.cppll.jp/HEAD/libs/bind/me...
#include<boost/mem_fn.hpp>
メンバ関数を関数オブジェクトとして扱えるようにする.std::...
class MemClass
{
public:
MemClass(int x) : a(x){}
void Print(){ cout << a << endl; }
private:
int a;
};
void main(void)
{
vector<MemClass> v;
v.push_back(MemClass(1));
v.push_back(MemClass(2));
v.push_back(MemClass(3));
for_each(v.begin(), v.end(), boost::mem_fn(&MemClass:...
}
**[[boost::lexical_cast:http://boost.cppll.jp/HEAD/libs/c...
#include<boost/lexical_cast.hpp>
文字列と値の変換を行う.C言語のitoaとかと同じ.
double x = 0.0;
std::string str;
str = boost::lexical_cast<std::string>(x);
x = boost::lexical_cast<double>(str);
**[[boost::format:http://boost.cppll.jp/HEAD/libs/format/...
#include<boost/format.hpp>
printfに似たような感じの書式化処理をする.
cout << boost::format("i : %1% - x=%2%, str=%3%") % 1 % ...
formatではformatオブジェクト(フォーマッタ)にオペレータ"%"...
boost::format frmt("i : %1% - x=%2%, str=%3%");
frmt % 1;
frmt % 15.0;
frmt % "rml";
でも可.std::stringではき出したい場合は,メンバ関数str()...
std::string str;
str = frmt.str();
str = boost::io::str(frmt);
フォーマッタに別の変数を食わせる場合は,そのまま,
frmt % 2;
frmt % 20.0;
frmt % "rml2";
と続ける.
書式指定に%1%,%2%・・・を用いる場合は並べ替えが可能.
cout << boost::format("%2%, %1%, %3%, %1%") % 1 % 2 % 3;
出力は 2, 1, 3, 1 となる.並び替えが必要でないなら従来のp...
cout << boost::format("%d, %s, %3.1f") % 1 % "2" % 3.0;
出力は 1, 2, 3.0 .
**[[boost::function:http://boost.cppll.jp/HEAD/doc/html/f...
#include<boost/function.hpp>
汎用関数オブジェクト.関数ポインタも関数オブジェクトも両...
class FuncClass
{
public:
FuncClass(int i, int j) : a(i), b(j) {}
double Dot(int x, int y){ return sqrt((double)(a*x+b*...
int a, b;
};
struct FuncObject
{
double operator()(int x, int y){ return sqrt((double)...
};
double Func(int x, int y)
{
return sqrt((double)(x*x+y*y));
}
とあった場合,関数ポインタ(Func(int x, int y))では,
boost::function<double (int, int)> length = &Func;
cout << boost::format("length = %f\n") % length(1, 2);
で出力は,length = 2.236068 となる.function<double (int,...
関数オブジェクト(FuncObject)は,
length = FuncObject();
cout << boost::format("length = %f\n") % length(2, 3);
出力は,length = 3.605551 となる.
クラスのメンバ関数を渡すときは,std::mem_fun と std::bind...
FuncClass obj(3, 4);
length = boost::bind(&FuncClass::Dot, boost::ref(obj), ...
cout << boost::format("length = %f\n") % length(3, 4);
出力は,length = 5.000000 となる.
**[[boost::xpressive:http://www.boost.org/doc/libs/1_46_1...
#include <boost/xpressive/xpressive.hpp>
正規表現クラス.boost::regexと違ってlibファイルは必要ない.
#code(C){{
/*!
* 正規表現に文字列がマッチするかどうかテスト
* @param[in] str 文字列
* @param[in] reg_str 正規表現
* @return マッチしたらtrue
*/
static bool Match(const string &str, const string ®_str)
{
using namespace boost::xpressive;
sregex reg = sregex::compile(reg_str);
smatch m;
if(regex_search(str, m, reg)){
return (m.str() == str);
}
else{
return false;
}
}
/*!
* 正規表現に文字列がマッチするかどうかテスト
* @param[in] str 文字列
* @param[in] reg_str 正規表現
* @param[out] mch マッチした部分文字列
* @return マッチしたらtrue
*/
static bool Match2(const string &str, const string ®_s...
{
using namespace boost::xpressive;
sregex reg = sregex::compile(reg_str);
smatch m;
if(regex_search(str, m, reg)){
mch.resize(m.size());
for(int i = 0; i < (int)mch.size(); ++i){
mch[i] = m[i];
}
return (m.str() == str);
}
else{
return false;
}
}
}}
**[[boost::random:http://www.boost.org/doc/libs/1_46_1/do...
#include <boost/random.hpp>
様々な乱数を生成する.以下は[[メルセンヌツイスタ:http://w...
#code(C){{
typedef boost::variate_generator< boost::mt19937, boost::...
typedef boost::variate_generator< boost::mt19937, boost::...
/*!
* 「メルセンヌツイスター」(Seed=現在時刻) で「正規乱数」...
* @param[in] _min 乱数の最小値
* @param[in] _max 乱数の最大値
* @return 「メルセンヌツイスター」(Seed=現在時刻) で「正...
*/
inline rxRandMtGen GenRandomGenerator(const double &_min,...
{
boost::mt19937 gen0(static_cast<unsigned long>(time(0)));
//boost::uniform_real<> dst0(_min, _max);
boost::normal_distribution<> dst0(0, 0.01);
rxRandMtGen rand0(gen0, dst0);
return rand0;
}
/*!
* 「メルセンヌツイスター」(Seed=現在時刻) で「定分布乱数...
* @param[in] _min 乱数の最小値
* @param[in] _max 乱数の最大値
* @return 「メルセンヌツイスター」(Seed=現在時刻) で乱数...
*/
inline rxRandMtUni GenRandomGeneratorMtUni(const double &...
{
boost::mt19937 gen0(static_cast<unsigned long>(time(0)));
boost::uniform_real<> dst0(_min, _max);
rxRandMtUni rand0(gen0, dst0);
return rand0;
}
}}
使うときは,
rxRandMtGen rand = GenRandomGenerator(0.0, 1.0);
for(int i = 0; i < 100; ++i){
cout << rand() << endl;
}
など.
**[[boost::iostreams:http://www.boost.org/doc/libs/1_46_1...
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/concepts.hpp>
#include <boost/iostreams/operations.hpp>
など.
オリジナルのストリームを作成することができる.
#code(C){{
//! テキストストリーム - コマンドプロンプトに表示すると共...
class rxCout : public boost::iostreams::sink
{
string m_strLog;
public:
rxCout(string fn)
{
m_strLog = fn;
}
std::streamsize write(const char* s, std::streamsize n)
{
string str;//=s;
str.resize(n);
for(int i = 0; i < n; ++i){
str[i] = s[i];
}
cout << str;
boost::algorithm::replace_all(str, "\n", "");
static std::ofstream fsOut(m_strLog, std::ios::out);
fsOut << str << endl;
return n;
}
};
static boost::iostreams::stream<rxCout> RXCOUT("test.log");
//#define RXCOUT std::cout
//! ファイルへのテキストストリーム
class rxCoutFile : public boost::iostreams::sink
{
//std::ofstream m_fsOut0;
public:
rxCoutFile(bool enable)
{
//m_fsOut.open("log/sph.log", std::ios::out);
}
std::streamsize write(const char* s, std::streamsize n)
{
string str;//=s;
str.resize(n);
for(int i = 0; i < n; ++i){
str[i] = s[i];
}
boost::algorithm::replace_all(str, "\n", "");
static std::ofstream fsOut("log/sph.log", std::ios::out);
fsOut << str << endl;
return n;
}
};
static boost::iostreams::stream<rxCoutFile> RXFOUT(true);
}}
例のRXCOUTをcoutの代わりに使うことで出力内容を画面に表示...
**boost::filesystem [#rc01b152]
***v3での変更点 [#t6e4843c]
-1バイト文字のpathと2バイト文字のwpathを,一つのクラスpat...
-pathクラスの新しいメンバ関数
--[[has_stem():http://www.boost.org/doc/libs/1_48_0/libs/...
ファイル名の最初から最後の"."までを抜き出したもの([[stem(...
--[[has_extension():http://www.boost.org/doc/libs/1_48_0/...
ファイル名に拡張子があればtrue, なければfalseを返す.
--[[is_absolute():http://www.boost.org/doc/libs/1_48_0/li...
絶対パスならtrue, 相対パスならfalseを返す.(同じ機能であ...
--[[is_relative():http://www.boost.org/doc/libs/1_48_0/li...
is_absolute()の逆.
--[[make_preferred():http://www.boost.org/doc/libs/1_48_0...
パス文字列を使用している環境でのネイティブフォーマットに...
Windowsなら"/"(スラッシュ)はすべて"\"(バックスラッシュ or...
-boost::filesytem関数の変更,新規追加
--[[absolute():http://www.boost.org/doc/libs/1_48_0/libs/...
絶対パスに変換.complete()を置き換える関数.
--[[create_symlink():http://www.boost.org/doc/libs/1_48_0...
シンボリックリンクを生成する関数.POSIXとWindows両方をサ...
--[[read_symlink():http://www.boost.org/doc/libs/1_48_0/l...
新規追加関数.シンボリックリンクの本体のパスを返す.
--[[resize_file():http://www.boost.org/doc/libs/1_48_0/li...
新規追加関数.ファイルサイズ変更.
--[[unique_path():http://www.boost.org/doc/libs/1_48_0/li...
新規追加関数.一時ファイル用のランダムなファイル名を生成...
たとえば,引数にpath("%%%%-%%%%")と指定すると"c463-8e59"...
詳しくは[[Boost Filesystem Version 3 - Introduction:http:...
*Visual C++でのインストール [#n289f7ea]
#include(build_boost,notitle)
*リンク [#te9e6f40]
-[[Boost C++ Libraries:http://boost.cppll.jp/HEAD/]]
-[[Let's Boost:http://www.kmonos.net/alang/boost/]]
終了行:
boostライブラリについて
-----
#contents
-----
*ライブラリ [#a989aab7]
**[[boost::bind:http://boost.cppll.jp/HEAD/libs/bind/bind...
個人的には一番よく使うのがboost::bind.
STLのbind1st, bind2stの汎用版である.任意の引数をbindして...
#include <boost/bind.hpp>
boost::bindは関数オブジェクトを作成することができるのだが...
例えば,
#code(C){{
int func2(int x, int y)
{
return x+y;
}
int func3(int x, int y, int z)
{
return x+y+z;
}
void main(void)
{
boost::function<int (int, int)> func;
func = func2;
cout << func(1, 2) << endl;
func = boost::bind(func3, _1, _2, 0);
cout << func(1, 2) << endl;
}
}}
のように,3引数を取る関数の最後の引数に渡す値を0に固定し...
また,下のboost::functionでも述べているが,メンバ関数につ...
#code(C){{
Class1 *obj = new Class1;
boost::function<int (int)> func = boost::bind(&Class1::Fu...
}}
**[[boost::mem_fn:http://boost.cppll.jp/HEAD/libs/bind/me...
#include<boost/mem_fn.hpp>
メンバ関数を関数オブジェクトとして扱えるようにする.std::...
class MemClass
{
public:
MemClass(int x) : a(x){}
void Print(){ cout << a << endl; }
private:
int a;
};
void main(void)
{
vector<MemClass> v;
v.push_back(MemClass(1));
v.push_back(MemClass(2));
v.push_back(MemClass(3));
for_each(v.begin(), v.end(), boost::mem_fn(&MemClass:...
}
**[[boost::lexical_cast:http://boost.cppll.jp/HEAD/libs/c...
#include<boost/lexical_cast.hpp>
文字列と値の変換を行う.C言語のitoaとかと同じ.
double x = 0.0;
std::string str;
str = boost::lexical_cast<std::string>(x);
x = boost::lexical_cast<double>(str);
**[[boost::format:http://boost.cppll.jp/HEAD/libs/format/...
#include<boost/format.hpp>
printfに似たような感じの書式化処理をする.
cout << boost::format("i : %1% - x=%2%, str=%3%") % 1 % ...
formatではformatオブジェクト(フォーマッタ)にオペレータ"%"...
boost::format frmt("i : %1% - x=%2%, str=%3%");
frmt % 1;
frmt % 15.0;
frmt % "rml";
でも可.std::stringではき出したい場合は,メンバ関数str()...
std::string str;
str = frmt.str();
str = boost::io::str(frmt);
フォーマッタに別の変数を食わせる場合は,そのまま,
frmt % 2;
frmt % 20.0;
frmt % "rml2";
と続ける.
書式指定に%1%,%2%・・・を用いる場合は並べ替えが可能.
cout << boost::format("%2%, %1%, %3%, %1%") % 1 % 2 % 3;
出力は 2, 1, 3, 1 となる.並び替えが必要でないなら従来のp...
cout << boost::format("%d, %s, %3.1f") % 1 % "2" % 3.0;
出力は 1, 2, 3.0 .
**[[boost::function:http://boost.cppll.jp/HEAD/doc/html/f...
#include<boost/function.hpp>
汎用関数オブジェクト.関数ポインタも関数オブジェクトも両...
class FuncClass
{
public:
FuncClass(int i, int j) : a(i), b(j) {}
double Dot(int x, int y){ return sqrt((double)(a*x+b*...
int a, b;
};
struct FuncObject
{
double operator()(int x, int y){ return sqrt((double)...
};
double Func(int x, int y)
{
return sqrt((double)(x*x+y*y));
}
とあった場合,関数ポインタ(Func(int x, int y))では,
boost::function<double (int, int)> length = &Func;
cout << boost::format("length = %f\n") % length(1, 2);
で出力は,length = 2.236068 となる.function<double (int,...
関数オブジェクト(FuncObject)は,
length = FuncObject();
cout << boost::format("length = %f\n") % length(2, 3);
出力は,length = 3.605551 となる.
クラスのメンバ関数を渡すときは,std::mem_fun と std::bind...
FuncClass obj(3, 4);
length = boost::bind(&FuncClass::Dot, boost::ref(obj), ...
cout << boost::format("length = %f\n") % length(3, 4);
出力は,length = 5.000000 となる.
**[[boost::xpressive:http://www.boost.org/doc/libs/1_46_1...
#include <boost/xpressive/xpressive.hpp>
正規表現クラス.boost::regexと違ってlibファイルは必要ない.
#code(C){{
/*!
* 正規表現に文字列がマッチするかどうかテスト
* @param[in] str 文字列
* @param[in] reg_str 正規表現
* @return マッチしたらtrue
*/
static bool Match(const string &str, const string ®_str)
{
using namespace boost::xpressive;
sregex reg = sregex::compile(reg_str);
smatch m;
if(regex_search(str, m, reg)){
return (m.str() == str);
}
else{
return false;
}
}
/*!
* 正規表現に文字列がマッチするかどうかテスト
* @param[in] str 文字列
* @param[in] reg_str 正規表現
* @param[out] mch マッチした部分文字列
* @return マッチしたらtrue
*/
static bool Match2(const string &str, const string ®_s...
{
using namespace boost::xpressive;
sregex reg = sregex::compile(reg_str);
smatch m;
if(regex_search(str, m, reg)){
mch.resize(m.size());
for(int i = 0; i < (int)mch.size(); ++i){
mch[i] = m[i];
}
return (m.str() == str);
}
else{
return false;
}
}
}}
**[[boost::random:http://www.boost.org/doc/libs/1_46_1/do...
#include <boost/random.hpp>
様々な乱数を生成する.以下は[[メルセンヌツイスタ:http://w...
#code(C){{
typedef boost::variate_generator< boost::mt19937, boost::...
typedef boost::variate_generator< boost::mt19937, boost::...
/*!
* 「メルセンヌツイスター」(Seed=現在時刻) で「正規乱数」...
* @param[in] _min 乱数の最小値
* @param[in] _max 乱数の最大値
* @return 「メルセンヌツイスター」(Seed=現在時刻) で「正...
*/
inline rxRandMtGen GenRandomGenerator(const double &_min,...
{
boost::mt19937 gen0(static_cast<unsigned long>(time(0)));
//boost::uniform_real<> dst0(_min, _max);
boost::normal_distribution<> dst0(0, 0.01);
rxRandMtGen rand0(gen0, dst0);
return rand0;
}
/*!
* 「メルセンヌツイスター」(Seed=現在時刻) で「定分布乱数...
* @param[in] _min 乱数の最小値
* @param[in] _max 乱数の最大値
* @return 「メルセンヌツイスター」(Seed=現在時刻) で乱数...
*/
inline rxRandMtUni GenRandomGeneratorMtUni(const double &...
{
boost::mt19937 gen0(static_cast<unsigned long>(time(0)));
boost::uniform_real<> dst0(_min, _max);
rxRandMtUni rand0(gen0, dst0);
return rand0;
}
}}
使うときは,
rxRandMtGen rand = GenRandomGenerator(0.0, 1.0);
for(int i = 0; i < 100; ++i){
cout << rand() << endl;
}
など.
**[[boost::iostreams:http://www.boost.org/doc/libs/1_46_1...
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/concepts.hpp>
#include <boost/iostreams/operations.hpp>
など.
オリジナルのストリームを作成することができる.
#code(C){{
//! テキストストリーム - コマンドプロンプトに表示すると共...
class rxCout : public boost::iostreams::sink
{
string m_strLog;
public:
rxCout(string fn)
{
m_strLog = fn;
}
std::streamsize write(const char* s, std::streamsize n)
{
string str;//=s;
str.resize(n);
for(int i = 0; i < n; ++i){
str[i] = s[i];
}
cout << str;
boost::algorithm::replace_all(str, "\n", "");
static std::ofstream fsOut(m_strLog, std::ios::out);
fsOut << str << endl;
return n;
}
};
static boost::iostreams::stream<rxCout> RXCOUT("test.log");
//#define RXCOUT std::cout
//! ファイルへのテキストストリーム
class rxCoutFile : public boost::iostreams::sink
{
//std::ofstream m_fsOut0;
public:
rxCoutFile(bool enable)
{
//m_fsOut.open("log/sph.log", std::ios::out);
}
std::streamsize write(const char* s, std::streamsize n)
{
string str;//=s;
str.resize(n);
for(int i = 0; i < n; ++i){
str[i] = s[i];
}
boost::algorithm::replace_all(str, "\n", "");
static std::ofstream fsOut("log/sph.log", std::ios::out);
fsOut << str << endl;
return n;
}
};
static boost::iostreams::stream<rxCoutFile> RXFOUT(true);
}}
例のRXCOUTをcoutの代わりに使うことで出力内容を画面に表示...
**boost::filesystem [#rc01b152]
***v3での変更点 [#t6e4843c]
-1バイト文字のpathと2バイト文字のwpathを,一つのクラスpat...
-pathクラスの新しいメンバ関数
--[[has_stem():http://www.boost.org/doc/libs/1_48_0/libs/...
ファイル名の最初から最後の"."までを抜き出したもの([[stem(...
--[[has_extension():http://www.boost.org/doc/libs/1_48_0/...
ファイル名に拡張子があればtrue, なければfalseを返す.
--[[is_absolute():http://www.boost.org/doc/libs/1_48_0/li...
絶対パスならtrue, 相対パスならfalseを返す.(同じ機能であ...
--[[is_relative():http://www.boost.org/doc/libs/1_48_0/li...
is_absolute()の逆.
--[[make_preferred():http://www.boost.org/doc/libs/1_48_0...
パス文字列を使用している環境でのネイティブフォーマットに...
Windowsなら"/"(スラッシュ)はすべて"\"(バックスラッシュ or...
-boost::filesytem関数の変更,新規追加
--[[absolute():http://www.boost.org/doc/libs/1_48_0/libs/...
絶対パスに変換.complete()を置き換える関数.
--[[create_symlink():http://www.boost.org/doc/libs/1_48_0...
シンボリックリンクを生成する関数.POSIXとWindows両方をサ...
--[[read_symlink():http://www.boost.org/doc/libs/1_48_0/l...
新規追加関数.シンボリックリンクの本体のパスを返す.
--[[resize_file():http://www.boost.org/doc/libs/1_48_0/li...
新規追加関数.ファイルサイズ変更.
--[[unique_path():http://www.boost.org/doc/libs/1_48_0/li...
新規追加関数.一時ファイル用のランダムなファイル名を生成...
たとえば,引数にpath("%%%%-%%%%")と指定すると"c463-8e59"...
詳しくは[[Boost Filesystem Version 3 - Introduction:http:...
*Visual C++でのインストール [#n289f7ea]
#include(build_boost,notitle)
*リンク [#te9e6f40]
-[[Boost C++ Libraries:http://boost.cppll.jp/HEAD/]]
-[[Let's Boost:http://www.kmonos.net/alang/boost/]]
ページ名: