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 0;
}

经过测试,如果显式的把拷贝构造函数和赋值操作符定义为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(1,"java"),make_pair(2,"python");

    // assign的push_back(), push_front(), insert()
    vector<int> v2;
    push_back(v2) (1)(2)(3);
    list<string> l;
    push_front(l) ("aa")("bb")("cc");
    map<int,string> 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 <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()==16);
    assert(u.size()==16);
    vector<unsigned char> v(16,7);
    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 0;
}

在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[10];
 strcpy(s2,s);
 cout<<s2<<endl;
 delete s2;

 return 0;
}

c++ boost库学习三:实用工具,布布扣,bubuko.com

时间: 2024-08-01 22:45:06

c++ boost库学习三:实用工具的相关文章

c++ boost库学习一:时间和日期

timer类 #include <boost\timer.hpp> #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { boost::timer t; cout<<"max time span: "<<t.elapsed_max()/3600<<"h"<<endl; //596.5

boost库学习之开篇

本系列文章使用boost_1.58.0版本. 一.欢迎使用boost C++库 boost致力于提供一个免费的.便携的源代码级的库. 我们重视那些与C++标准一起工作良好的库.boost库将要成为一个应用广泛的库,成为应用程序可以依赖的平台.boost证书估计商业和非商业机构使用它. 我们的目标是建立已存在的练习而且提供对于库具体实现的引用以至于boost库适合于最后的标准.十个boost库已经包含在C++标准委员会的TR1而且将要被包含在即将到来的C++标准版本中.更多的boost库将目标放在

Boost库学习之旅入门篇

学习及使用Boost库已经有一段时间了,Boost为我的日常开发中带来了极大的方便,也使得我越来越依赖于boost库了.但boost功能太多,每次使用还是得翻看以前的 资料,所以为了以后可以更方便的使用,在此对常用的功能作一个总结,也希望以此与大家共勉. boost库下载,Svn地址: http://svn.boost.org/svn/boost/trunk 编译源码 编译boost库自带脚本解释工具: 使用vs自带命令行工具Visual Studio 命令提示(2010),运行bat脚本boo

boost库学习之regex

一.背景 项目中许多地方需要对字符串进行匹配,比如根据指定的过滤字符串来过滤文件名.刚开始是排斥使用boost库的,第一,我不熟悉boost库:第二,如果引入第三方库,就会增加库的依赖,这样的后果是,要么打包程序时,打包动态库,要么直接使用静态库编译,会使增大程序的大小. 刚开始是尝试自己写模糊匹配算法,很简单,就只支持_和%,这两个通配符,然后发现Linux下有一个fnmatch的函数,就是进行模糊匹配的,它支持shell通配符. 但是到最后发现,当需要区别很相似的字符串时,模糊匹配就不行了,

boost库学习之 timer库

timer是一个很小的库,提供简易的时间度量和进度显示,包括timer.progress_timer.progress_display三个类.不适合高精度的时间测量任务,精度依赖于操作系统或编译器,可提供的最大时间跨度只有几百个小时,不适合大跨度的时间段测量. timer类 先来看一下标准库如何计时: #include <iostream> #include <ctime> using namespace std; int main() { clock_t begin, end;

boost库学习之 date_time库

 date_time库是一个全面灵活的日期时间库,提供时间相关的各种所需功能,也是一个比较复杂的库.它支持从1400-01-01到9999-12-31之间的日期计算.使用时包含#include <boost/date_time/gregorian/gregorian.hpp>头文件, 引用boost::gregorian;命名空间. 日期 date是date_time库中的核心类.以天为单位表示时间点. date d1; //无效日期 date d2(2015, 1, 4); date d

boost库学习之 pool库

简单来说内存池预先分配了一块大的内存空间,然后在其中使用某种算法高效快速的自定制内存分配. pool库包含四个组成部分,最简单的pool,分配类实例的object pool,单件内存池singleton_tool和用于标准库的pool_alloc. 为了使用pool组件,需要包含<boost/pool/pool.hpp>头文件. 操作函数: pool的构造函数接受一个size_type类型的整数request_size,指示每次pool分配内存块的大小 成员函数get_request_size

boost库学习之 scoped_ptr scoped_array

boost.smart_ptr库提供了六种智能指针:scoped_ptr.scoped_array.shared_ptr.shared_array.week_ptr和intrusive_ptr. 说到智能指针,我们会想到c++98标准中的自动指针auto_ptr. auto_ptr获取指针所有权后,离开作用域时自动释放该指针指向的堆内存.也可以转移指针的所有权. auto_ptr<A> ap_a1(new A); auto_ptr<A> ap_a2(ap_a1); //发生所有权转

boost asio 学习(三)

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=4 本章节为io_service添加任务,并且区分dispatch与post的区别.如果说io_service是asio库的大脑,那么post与dispatch就是asio库的手和脚. 先看看示例1 #include <boost/asio.hpp> #include <boost/shared_ptr.hp