Top Page > Boostの紹介 > サンプル集


Boost サンプル


regex:正規表現を扱う(ラッパのgimite::reg_manager使用)

#include <string>
#include <iostream>
#include <gimite/reg_manager.h>
 
void main(){
 gimite::reg_manager rm;
 std::string s= "<h1>Title</h1>Hello.";
 if (rm.search(s, "<h1>(.*?)</h1>")) // 検索
  std::cout<<rm.str(1)<<std::endl; // 前方参照
 rm.replace(s, "<h1>(.*?)</h1>", "<p>\\1</p>", "g"); // 置換
 std::cout<<s<<std::endl;
}

出力:
Title
<p>Title</p>Hello.

ラッパなんぞ使わんわ!という方はこちら


smart_ptr:スマートポインタを要素とするコンテナを作る

#include <vector>
#include <iostream>
#include <boost/shared_ptr.hpp>
 
struct Boo{
 Boo(){ std::cout<<"Boo "; }
 ~Boo(){ std::cout<<"~Boo "; }
};
typedef boost::shared_ptr<Boo> BooPtr;
 
void main(){
 std::vector<BooPtr> v;
 v.push_back(BooPtr(new Boo));
 v.push_back(BooPtr(new Boo));
}

出力:
Boo Boo ~Boo ~Boo


smart_ptr:どこからも削除されなくなったら自動でdeleteする

#include <iostream>
#include <boost/shared_ptr.hpp>
 
struct Boo{
 int i_;
 Boo(int i): i_(i){ std::cout<<i_<<" Boo"<<std::endl; }
 ~Boo(){ std::cout<<i_<<" ~Boo"<<std::endl; }
 void f(){ std::cout<<i_<<" f"<<std::endl; }
};
 
void main(){
 boost::shared_ptr<Boo> pb1, pb2;
 pb1.reset(new Boo(1));
 pb2= pb1;
 pb2->f();
 pb1.reset(new Boo(2));
 pb2= pb1;
 pb1->f();
}

出力:
1 Boo
1 f
2 Boo
1 ~Boo
2 f
2 ~Boo


format:ostreamにprintf形式で出力する

#include <iostream>
#include <boost/format.hpp>
 
void main(){
 std::cout<<boost::format("%s is %.2lf.")%"Pi"%3.14159265<<std::endl;
}

出力:
Pi is 3.14.

%演算子でフォーマットに引数を与えます。


function:メンバ関数や関数オブジェクトも代入できる、関数ポインタもどきを作る

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
 
struct Boo{
 void f(int i, int j)
  { std::cout<<"Sum is "<<(i+j)<<"."<<std::endl; }
};
 
struct Goo{
 void g(int i, int j)
  { std::cout<<"Difference is "<<(i-j)<<"."<<std::endl; }
};
 
void main(){
 Boo boo; Goo goo;
 boost::function2<void, int, int> func;
 func= boost::bind(&Boo::f, &boo, _1, _2); // boo.fを代入
 func(13, 7);
 func= boost::bind(&Goo::g, &goo, _1, _2); // goo.gを代入
 func(13, 7);
}

出力:
Sum is 20.
Difference is 6.

boost::bindの引数の _1, _2, ... はメンバ関数のパラメータの数だけ続けます。


tuple:複数の戻り値を返し、複数の変数で受け取る

#include <iostream>
#include <string>
#include <boost/tuple/tuple.hpp>
 
boost::tuple<int, double, std::string> foo(){
 return boost::make_tuple(3, 1.41, "Hello");
}
 
void main(){
 int i;
 double f;
 std::string s;
 boost::tie(i, f, s)= foo();
 std::cout<<i<<' '<<f<<' '<<s<<std::endl;
}

出力:
3 1.41 Hello


operators:自前のクラスの演算子を補完する

#include <iostream>
#include <boost/operators.hpp>
 
class int_modoki
 : boost::totally_ordered<int_modoki, // <,==を元に>,<=,>=,!=を定義
  boost::additive<int_modoki> > // +=,-=を元に+,-を定義
{
 int i_;
public:
 int_modoki(int i): i_(i){}
 int_modoki& operator+=(const int_modoki& im)
  { i_+= im.i_; return *this; }
 int_modoki& operator-=(const int_modoki& im)
  { i_-= im.i_; return *this; }
 friend bool operator==(const int_modoki& im1, const int_modoki& im2)
  { return im1.i_==im2.i_; }
 friend bool operator<(const int_modoki& im1, const int_modoki& im2)
  { return im1.i_<im2.i_; }
 friend std::ostream& operator<<(std::ostream& os, const int_modoki& im)
  { os<<im.i_; return os; }
};
 
void main(){
 int_modoki i(3), j(6);
 std::cout<<(i+j)<<' '<<(i-j)<<std::endl;
 if (j>=i){ std::cout<<"j>=i"<<std::endl; }
}

出力:
9 -13
j>=i

他にも乗算を定義するmultipliableとか、色々。


bind:3引数以上の関数オブジェクトを束縛(bind)する

#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/bind.hpp>
 
void f(int a, int b, int c){
 std::cout<<"f("<<a<<','<<b<<','<<c<<')'<<std::endl;
}
 
void main(){
 std::vector<int> v;
 v.push_back(10); v.push_back(3); v.push_back(5);
 std::for_each(v.begin(), v.end(), boost::bind(f, 0, _1, 9));
  // _1の所に新しい関数オブジェクトの第1引数が入る
}

出力:
f(0,10,9)
f(0,3,9)
f(0,5,9)


math:最大公約数、最小公倍数を求める

#include <iostream>
#include <boost/math/common_factor.hpp>
 
void main(){
 std::cout<<"GCD(4, 10) = "<<boost::math::gcd(4, 10)<<std::endl;
 std::cout<<"LCM(4, 10) = "<<boost::math::lcm(4, 10)<<std::endl;
}

出力:
GCD(4, 10) = 2
LCM(4, 10) = 20


余談:
極力サンプルを短くしようとした結果、意味の無いサンプルが多くなった感じ。この辺のバランスはどうすれば…。
void mainを使ってるのも、1行減らすためなんですが(笑)。やめたほうがいいかなあ。一度 core dumped. って出たし…。


Gimite 市川 <gimite@mx12.freecom.ne.jp>


サンプル集 < Boostの紹介 < Top Page