zoukankan      html  css  js  c++  java
  • boost-实用工具:noncopyable、optional、assign

    1、noncopyable

      让一个类从noncopyable继承可以实现禁止对象的复制,使用需要包含头文件"boost/noncopyable.hpp"或"boost/utility.hpp"。noncopyable实际上是将类的拷贝构造函数和赋值操作符声明为了private来实现禁止对象的赋值。

    #include "boost/utility.hpp"
    
    class    CMyClass:public boost::noncopyable
    {
    
    };
    int main()
    {
        CMyClass a, b;
        a = b; //error
        CMyClass c(a); //error
    
        return 0;
    }
    View Code

    2、optional

      optional类可以表示一个无意义的值,比如以下代码,我们使用get_optional()查找xml上的一个节点,如果该节点不存在的话就会返回一个无效的optional对象,此时对象就是空的。

        ptree pt;
        read_xml("conf.xml", pt);
    
        boost::optional<int> op = pt.get_optional<int>("conf.gui");
        if (op)//节点不存在则op为空
        {
            int i = op.get();
        }
    View Code

      成员函数:

      无参数或参数为boost::none的构造函数用来构造一个无效的对象。

      如果构造函数中的参数是一个值的引用的话,那么optional中元素其实也是这个值的引用。

      get()可以获得元素的引用,get_value_or()也可以获得元素的引用,如果对象是无效的话get_value_or()还可以设置一个默认的返回值,get_ptr()可以获得元素的指针。

      提供了隐式bool类型转换以判断对象的有效性。

      重载了operator*和operator->,*运算可以获得元素的值,->操作可以获得元素的指针。

      支持==、!=、>等比较运算。

      使用make_optional()来创建optional对象的话可以不用指定参数的类型,它可以根据参数来自动推导optional的类型。

    #include <vector>
    #include "boost/optional.hpp"
    #include "boost/typeof/typeof.hpp"
    int main()
    {
        boost::optional<int> op0;
        boost::optional<int> op1(boost::none);
        assert(op0 == op1);
        int n = op0.get_value_or(0);
        
        boost::optional<string> ops("test");
        cout << *ops << endl;
    
        vector<int> vc;
        boost::optional<vector<int>&> opv(vc);
        opv->push_back(5);
        assert(vc.size() == 1);
    
        boost::optional<double> opd = boost::make_optional(12.56);
        cout << *opd << endl;
    
        BOOST_AUTO(x, boost::make_optional(5));
        assert(*x == 5);
    
        return 0;
    }
    View Code

      in_place()

      optional要求参数具有拷贝语义, 因为它会使用参数值的临时拷贝,如果参数是一个复杂的对象的话这种拷贝方式效率就会很慢,我们可以使用boost库in_place_factory中的in_place()函数来就地创建对象,避免对参数值的临时拷贝,eg:

    #include "boost/optional.hpp"
    #include "boost/utility/in_place_factory.hpp"
    int main()
    {
        boost::optional<string> ops(boost::in_place("test_in_place")); //就地创建optional,不需要临时对象string("test_in_place");
    
        return 0;
    }
    View Code

    3、assign

      使用assign库除了要包含头文件"boost/assign.hpp"外,还要添加对assign命名空间的使用声明:using namespace boost::assign;

      assign库重载了operator+=、operator,、operator(),简化了向STL容器增加元素的方法。

    #include "boost/assign.hpp"
    using namespace boost::assign;
    int main()
    {
        //使用+=向容器添加元素
        vector<int> v;
        v += 1, 2, 3, 4 * 4;
    
        map<int, string> m;
        m += make_pair(1, "one"), make_pair(2, "two"), make_pair(3, "three");
    
        //使用()向容器添加元素,需要配合assigin的三个函数使用:insert()、push_front()、push_back()
        vector<int> v;
        push_back(v) (1) (2) (3);
        push_back(v), 4, 5, 6;
    
        list<string> l;
        push_front(l) ("cpp") ("jave");
        push_front(l), "c#", "python";
    
        map<int, string> m;
        insert(m) (1, "one") (2, "two") (3, "three");
    
        return 0;
    }
    View Code

      assigin使用list_of()、map_list_of()/pair_list_of()、tuple_list_of()来使容器构造的时候就完成了元素的填充,即容器的初始化。

    vector<int> v = list_of(1) (2) (3);
    map<int, string> m = map_list_of(1, "one") (2, "two") (3, "three");
    //tuple_list_of用来初始化元素类型为tuple的容器
    View Code

     

  • 相关阅读:
    排序
    最小栈
    移除链表元素
    回文链表
    maven自动建立目录骨架
    maven的结构和构建命令
    递归
    链表的中间结点
    括号匹配
    软件工程个人作业01
  • 原文地址:https://www.cnblogs.com/milanleon/p/7465866.html
Copyright © 2011-2022 走看看