c++ boost库学习三:实用工具
noncopyable
大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等。
这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法。
一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码。
于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了。
#include "iostream"
#include <string>
#include <boost\noncopyable.hpp>
using namespace std; class A:public boost::noncopyable
{
//public:
// A(){};
// A(const A&a){cout<<"call copy constructor"<<endl;}
}; int _tmain(int argc, _TCHAR* argv[])
{
A a;
A b(a); //error
A c;
c=a; //error
return ;
}
经过测试,如果显式的把拷贝构造函数和赋值操作符定义为public的话,noncopyable就失效了。
assign
用过vector等容器的都知道向vector里添加元素可以用insert或push_back方法,但这些方法都太复杂了。
boost库为大家提供了一个简单的方法assign,看过它的用法后你就知道它真的很方便
#include "iostream"
#include <string>
#include <map>
#include <list>
#include <boost\assign.hpp>
using namespace std;
using namespace boost::assign; int _tmain(int argc, _TCHAR* argv[])
{
// += 操作符
vector<string> v;
v+= "aa","bb","cc";
map<int,string> m;
m+=make_pair(,"java"),make_pair(,"python"); // assign的push_back(), push_front(), insert()
vector<int> v2;
push_back(v2) ()()();
list<string> l;
push_front(l) ("aa")("bb")("cc");
map<int,string> m2; //push_back 和 push_front只能用在拥有同名方法的容器里
insert(m2) (,"java")(,"c++");
return ;
}
uuid
uuid就是机器的唯一识别码,一共有128位(16字节)。用uuid可以生成全球唯一的标识,这个东西在写程序的时候会经常用到,比如一款软件的序列号只能用在1台机器上时它就是靠识别uuid来判断的。
可以把uuid看作一个16字节长元素类型为unsign char的容器。
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <assert.h>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
using namespace boost::uuids;
using namespace std;
int main()
{
uuid u;
assert(u.static_size()==);
assert(u.size()==);
vector<unsigned char> v(,);
copy(v.begin(),v.end(),u.begin());
cout<<u<<endl; // uuid生成算法
uuid u2 = random_generator()(); //随机生成一个不重复的uuid
assert(!u2.is_nil()); //判断是否无效uuid
assert(u!=u2);
cout<<u2<<endl; // uuid与字符串的转换
uuid u3 = string_generator()("01234567-89ab-cdef-0123-456789abcdef");
stringstream ss;
ss<<u3;
string s;
ss>>s;
cout<<s<<endl; return ;
}
在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 <boost\config\warning_disable.hpp>,其作用是避免VC编译器在使用已经deprecated函数的时候会出现c4996 error从而无法编译通过
比如下面的例子:
#include <boost\config\warning_disable.hpp>
#include <iostream>
using namespace std; int main()
{
char s[]="teststr";
char *s2=new char[];
strcpy(s2,s);
cout<<s2<<endl;
delete s2; return ;
}
c++ boost库学习三:实用工具的更多相关文章
- boost库学习之开篇
本系列文章使用boost_1.58.0版本. 一.欢迎使用boost C++库 boost致力于提供一个免费的.便携的源代码级的库. 我们重视那些与C++标准一起工作良好的库.boost库将要成为一个 ...
- Boost库学习之旅入门篇
学习及使用Boost库已经有一段时间了,Boost为我的日常开发中带来了极大的方便,也使得我越来越依赖于boost库了.但boost功能太多,每次使用还是得翻看以前的 资料,所以为了以后可以更方便的使 ...
- boost库学习之regex
一.背景 项目中许多地方需要对字符串进行匹配,比如根据指定的过滤字符串来过滤文件名.刚开始是排斥使用boost库的,第一,我不熟悉boost库:第二,如果引入第三方库,就会增加库的依赖,这样的后果是, ...
- Guava库介绍之实用工具类
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
- c++ boost库学习一:时间和日期
timer类 #include <boost\timer.hpp> #include "iostream" using namespace std; int _tmai ...
- boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等
一.使用同步定时器 这个示例程序通过展示如何在一个定时器执行一个阻塞等待. //makefile #-------------------------------------------------- ...
- boost asio 学习(三)post与dispatch
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=4 本章节为io_ ...
- c++ boost库学习二:内存管理->智能指针
写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...
- boost库的安装,使用,介绍,库分类
1)首先去官网下载boost源码安装包:http://www.boost.org/ 选择下载对应的boost源码包.本次下载使用的是 boost_1_60_0.tar.gz (2)解压文件:tar - ...
随机推荐
- Android项目页面跳转小Demo
近期在做Android项目的开发,刚刚接触会有非常多新东西须要学习,从环境的搭建到语言的熟悉都是须要一步步完毕的,接下来就拿一个页面跳转的样例来和大家分享一下自己的心得体会. 採用的架构: Demo中 ...
- 从 ie10浏览器下Symbol 未定义的问题 探索vue项目如何兼容ie低版本浏览器(ie9, ie10, ie 11 )
问题: vue项目在ie11下一片空白并报Symbol 未定义的错 原因: ie10浏览器解析不了es6的语法,需要我们使用babel(Babel是一种工具链,主要用于将ECMAScr ...
- Laravel5.1 Middleware中间件(初级)
中间件?什么鬼? 大家第一次接触这个词都会有这么个疑问,但它其实没那么神秘. 一句话就可以解释它:过滤HTTP请求专用机制. 为什么要使用中间件? 过滤HTTP请求是可以写在别的地方,比如说控制器中 ...
- eclipse中如何查看一个android模拟器的内部文件
eclipse中如何查看一个android模拟器的内部文件,有时要在其中添加一个文件夹或是什么的,要手动的做这件事,而不能够用代码去完成时,就要用这个方法了. 1.首先,打开一个安卓模拟器. 2.这个 ...
- 带参数的main函数
带参数的main函数 int main(int argc,char **argv) 或int main(int argc,char *argv[]) /*解析 依据<C程序设计语言(第二版. ...
- 将DataTable转换成Json格式
方法一: 将DataTable数据拼接成json字符串,方法如下: ///<summary> /// dataTable转换成Json格式 ///</summary> ///& ...
- docker related,docker history
History of an image and size of layers: docker history --no-trunc=true zabbix/zabbix-3.0 | tr -s ' ' ...
- 内置函数:sorted 用法
内置函数——sorted 对list.dict进行排序,Python提供了两个方法 对给定的List L进行排序,方法1: 用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2: ...
- Centos6.3下Ganglia3.6.0安装配置
近期安装Ganglia.因为之前Linux基础基本为0.因此费了非常大的周折.最后在失败了好多次之后最终看到了梦寐以求的web界面.以下总结下这几天来的工作. ganglia是一个监控软件,他包括三部 ...
- Hexo+yilia博客首页不显示全文,显示more,截断文章。
个人主页:https://www.yuehan.online hexo new “xxx” 在md文档中 插入<!--more-->即可. 现在博客:www.wangyurui.top