Boost库使用总结

auto_ptrshared_ptrweak_ptrscoped_ptr用法小结

智能指针,与引用计数相关

auto_ptr: 主要为异常安全设计的,在程序正常退出或者异常终止,会调用类的析构函数,释放资源。

复制\赋值是损坏性的操作,所以不能绑定到数组或者变量指针,也不能将auto_ptr对象存储在容器中。 

auto_ptr a(new int(10));
auto_ptr b;
b.reset(new int(5));
a = b;

//先解除a绑定的对象

//将a指向b

//b最后为未绑定状态

if (a.get()) //来判断是否初始化auto_ptr实例

 

shared_ptr:

构造函数

std::shared_ptr<int>p5 (new int, [](int* p){delete p;}, std::allocator<int>());

 

可以指定deleter

boost::static_visitor

visitor设计模式

不同的操作,使用同一接口访问、调用

visitor模式实现了不改变类本身,却改变类的行为的功能

想要分别处理各种不同类型的数据, Boost.Variant 为我们提供了一个名为 boost::apply_visitor() 的函数。

#include
#include
#include
#include
#include
 
std::vectorvector;
 
structoutput :
  public boost::static_visitor<>
{
  void operator()(double &d) const
  {
    vector.push_back(d);
  }
 
  void operator()(char &c) const
  {
    vector.push_back(c);
  }
 
  void operator()(std::string &s) const
  {
    vector.push_back(s);
  }
};
 
intmain()
{
  boost::variant v;
  v = 3.14;
  boost::apply_visitor(output(), v);
  v = 'A';
  boost::apply_visitor(output(), v);
  v = "Hello, world!";
  boost::apply_visitor(output(), v);
}


可以做如下优化

#include
#include
#include
#include
#include
 
std::vectorvector;
 
structoutput :
  public boost::static_visitor<>
{
  template 
  void operator()(T &t) const
  {
    vector.push_back(t);
  }
};
 
intmain()
{
  boost::variant v;
  v =3.14;
  boost::apply_visitor(output(), v);
  v = 'A';
  boost::apply_visitor(output(), v);
  v = "Hello, world!";
  boost::apply_visitor(output(), v);
}

boost statechart(boost状态图)

boost statechart是boost的状态机库, Boost状态机库是一个应用程序框架,你可以用它将UML状态图快速的转换为可执行的c++代码,而不需要任何的代码生成器。它支持几乎所有的UML特征,可以直接了当的转换,并且转换后的c++代码就像对状态机进行一次文本描述一样具体可读性。

 

boost thread

http://zh.highscore.de/cpp/boost/multithreading.html

 

编译链接库

-lboost_thread-mt

类似linux下的thread\mutex\condition实现线程同步

 

boost::mutexm_pending_ios_mutex;
boost::conditionm_pending_ios_empty;
func()
{
       boost::mutex::scoped_locklock(m_pending_ios_mutex);
       //do something
       m_pending_ios_empty.timed_wait(lock,boost::posix_time::seconds(1));
}

或者

 #include 
 #include 
 #include 
 
 boost::mutex io_mutex;
 
 void count()    // worker function
 {
     for (int i = 0;i < 10; ++i)
      {
         boost::mutex::scoped_lock lock(io_mutex);
         std::cout << i << std::endl;
      }
 }
 
 int main(int argc, char* argv[])
 {
     boost::thread thrd1(&count);
     boost::thread thrd2(&count);
     thrd1.join();
     thrd2.join();
 
     return 0;
}

Mutex和lock

1.  typedef boost::unique_lock ReadLock;  
2.  typdef boost::shared_lock WriteLock; 

boost::unique_lock表示独占锁

boost::shared_lock表示共享锁(可以多读)

使用boost::shared_mutex构造读写锁时需要使用到boost中的lock帮助类系列

 

线程在中断点,可以从外部中断

在一个线程对象上调用 interrupt() 会中断相应的线程。 在这方面,中断意味着一个类型为 boost::thread_interrupted 的异常,它会在这个线程中抛出。 然后这只有在线程达到中断点时才会发生。 

timed_join 等待一段时间后停止线程


boost::system_time

boost::system_time

boost::get_system_time() 获取系统当前时间

boost::posix_time::microseconds() 换算为指定的时间段

boost::posix_time::ptime则用于定义一个位置无关的时间

boost::posix_time::neg_infin

boost::this_thread::sleep()

boost::intrusive::list

侵入式指针

http://www.hongquan.me/?p=144

 

相比标准库std::list(非侵入式指针)

两者的主要区别:

std::list的用户数据并不拥有其在链表中的位置信息

为了删除这个数据,你必须要首先找到这个数据在std::list中的位置,然后调用list::erase来删除这个用户数据。而查找这个动作的时间复杂度为O(n/2)。

当你需要频繁插入删除数据并且你需要查找才知道数据所在位置的时候,std::list或许并不是一个特别好的选择。


Boost::intrusive::list的优点:

可以通过节点自己,直接删除链表中对应的节点

当然了如果直接使用boost::intrusive::listerase方法的话,那么和std::list之间没有什么差别。所以我们需要使用auto_unlinkmode.


Boost::random 随机数

比较常用的 pseudo-random number generator 是 hellekalek1995(少数几维),mt11213b(可到 350D)和 mt19937(可到 623D)。

 

随机数生成器:

boost一共提供了17种类型伪随机发生器供使用者选择,它们是:

minstd_rand,  rand48, lrand48,ecuyer1988, kreutzer1986, hellekalek1995, mt11213b, mt19937, lagged_fibonacci607, lagged_fibonacci1279, lagged_fibonacci2281, lagged_fibonacci3217,lagged_fibonacci4423, lagged_fibonacci9689, lagged_fibonacci19937,lagged_fibonacci23209, lagged_fibonacci44497

 

boost random提供了如下的分布函数:

uniform_smallint------ 一个整数集上的离散均匀分布

uniform_int ------一个整数集上的离散均匀分布

uniform_01 ------[0, 1)上的连续均匀分布

uniform_real------ [ min, max)上的连续均匀分布

bernoulli_distribution------ 伯努利分布

geometric_distribution------ 几何分布

triangle_distribution------ 三角分布

exponential_distribution------ 指数分布

normal_distribution------ 正态分布

lognormal_distribution------ 对数正态分布

uniform_on_sphere------ 球面上的均匀分布

 

生成随机数

typedef boost::mt11213brngen_t;

rngen_t rng;

boost::uniform_int(min,max)(rng);

生成在(min,max)整数集上,以mt11213b为随机数生成器的离散均匀分布

Boost::PropertyTree 操作ini配置文件

若配置文件中存在相同项会报错

terminate called after throwing an instanceof'boost::exception_detail::clone_impl>'

 what():  /etc/zbkc/zbkc.conf(122):duplicate section name

读取文件read_ini(fn, pt)

写文件 write_ini(fn, pt)

Boost::optional


BOOST_FOREACH

BOOST_FOREACH可以方便的遍历STL容器

#include
vector _v;
BOOST_FOREACH(int32_t value,_v)
{
//这里就可以访问value
} 

同时元素还支持引用,const,比如上面代码还可以写成:

vector _v;
BOOST_FOREACH(int32_t& value,_v)
{
//这里就可以修改/访问value
} 

如果元素内容是结构体之类,引用可以防止拷贝~~

对于map的访问有一点特殊,因为map的元素是std::pair,所以需要写成这样:

std::map _map;
typedef const std::map::value_type const_pair;
BOOST_FOREACH(const_pair& node,_map)
{
//这里就可以访问node的元素
int32_tkey = node.first;
int32_tvalue = node.second;
}

或者

Pair p;
BOOST_FOREACH(p, _map)
{
         //do something here
}
 

Boost::shared_lock 非独占锁,读锁

boost::unique_lock 类型的非独占锁

 

线程本地存储

boost::thread_specific_ptrtls;

类似done

 

你可能感兴趣的:(后台开发,编程语言,boost库)