regex:正規表現を扱う(ラッパのgimite::reg_manager使用)
#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 <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 <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
#include <boost/format.hpp>
void main(){
std::cout<<boost::format("%s is %.2lf.")%"Pi"%3.14159265<<std::endl;
}
出力:
Pi is 3.14.
%演算子でフォーマットに引数を与えます。
function:メンバ関数や関数オブジェクトも代入できる、関数ポインタもどきを作る
#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, ... はメンバ関数のパラメータの数だけ続けます。
#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
#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 <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)
#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>