boost库 tbb_c++ boost库学习三:实用工具

noncopyable

大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等。

这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法。

一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码。

于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了。

#include "iostream"#include#include

using namespacestd;class A:publicboost::noncopyable

{//public://A(){};//A(const A&a){cout<

};int _tmain(int argc, _TCHAR*argv[])

{

A a;

A b(a);//error

A c;

c=a; //error

return 0;

}

经过测试,如果显式的把拷贝构造函数和赋值操作符定义为public的话,noncopyable就失效了。

assign

用过vector等容器的都知道向vector里添加元素可以用insert或push_back方法,但这些方法都太复杂了。

boost库为大家提供了一个简单的方法assign,看过它的用法后你就知道它真的很方便

#include "iostream"#include#include#include#include

using namespacestd;using namespaceboost::assign;int _tmain(int argc, _TCHAR*argv[])

{//+= 操作符

vectorv;

v+= "aa","bb","cc";

mapm;

m+=make_pair(1,"java"),make_pair(2,"python");//assign的push_back(), push_front(), insert()

vectorv2;

push_back(v2) (1)(2)(3);

listl;

push_front(l) ("aa")("bb")("cc");

map m2; //push_back 和 push_front只能用在拥有同名方法的容器里

insert(m2) (1,"java")(2,"c++");return 0;

}

uuid

uuid就是机器的唯一识别码,一共有128位(16字节)。用uuid可以生成全球唯一的标识,这个东西在写程序的时候会经常用到,比如一款软件的序列号只能用在1台机器上时它就是靠识别uuid来判断的。

可以把uuid看作一个16字节长元素类型为unsign char的容器。

#include #include#include#include#include#include#include#include

using namespaceboost::uuids;using namespacestd;intmain()

{

uuid u;

assert(u.static_size()==16);

assert(u.size()==16);

vector v(16,7);

copy(v.begin(),v.end(),u.begin());

cout<

uuid u2 = random_generator()(); //随机生成一个不重复的uuid

assert(!u2.is_nil()); //判断是否无效uuid

assert(u!=u2);

cout<

uuid u3 = string_generator()("01234567-89ab-cdef-0123-456789abcdef");

stringstream ss;

ss<

ss>>s;

cout<

}

在vs中编译上面的代码时候可能会报warning C4996错,这时候有两种方法可以解决此问题

1. 需要向文件最开头(我有stdafx.h所以在里面加)里加上#define _SCL_SECURE_NO_WARNINGS,可参考

http://choorucode.com/2010/08/30/visual-c-c4996-warning-on-copy-with-array-parameters/,

2. 在所有#include之前(不包括stdafx.h)加上#include ,其作用是避免VC编译器在使用已经deprecated函数的时候会出现c4996 error从而无法编译通过

比如下面的例子:

#include #include

using namespacestd;intmain()

{char s[]="teststr";char *s2=new char[10];

strcpy(s2,s);

cout<

delete s2;return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值