zoukankan      html  css  js  c++  java
  • C++标准库(一)之新语言特性

    新语言特性

    • nullptr被解释为一个void*,不同于NULL被解释为一个int
    • 可以用auto在编译期完成自动推导,不会影响执行期的速度
    • 新的for循环方式:
    for(decl : coll)
    {
        statement
    }
    
    • rvalue reference也是一个reference,也就是说,下面这段代码是无效的:
    X&& foo()
    {
        X x;
        return std::move(x);
    }
    
    • 关键字:expllicit意味着在对象构造期间不能有显式类型转换
    • 关键字:noexcept用来表示某个函数不打算抛出异常。异常出现在运行期而非编译期,但是运行期的异常会使得编译器产生额外的指令代码。可在析构函数,swap函数,move构造函数和move assignment操作符使用此声明。总之,和资源管理相关的函数都不应该抛出异常.
    void foo() noexcept
    
    • 关键字:constexpr可用来让表达式核定于编译器。
    • 关键字:mutable修饰任何情况下都可变的变量,即使该变量被const修饰
    • Lambda表达式:
    int x,y;
    auto lambda = [x,&y]()->double{return 42+x*y;};
    
    • 关键字:decltype用于描述表达式类型,两种基本用法:
    int x,y;
    
    decltype(x+y) add(int x,int y);
    auto add(int x,int y) -> decltype(x+y);
    

    通用工具

    • 对于tuplepair元素来说:
    std::tuple<int,std::string,std::vector<int>> tupple;
    auto one = std::get<0>(tupple);
    auto two = std::get<1>(tupple);
    auto three = std::get<2>(tupple);
    

    可以获得pair或者tuple中的元素。
    pair默认实现<比较运算符,且以first的值作为比较的对象。

    • shared_ptrunique_ptr的用法:
    shared_ptr<int> ptr(new int[10],[](int* array){delete [] array;});
    unique_ptr<int,void(*)(int*)> uptr(new int[10],[](int* array){delete [] array;});
    ptr.get();   //获得指向资源的裸指针,若为空,返回nullptr
    ptr.use_count();    //返回共享计数
    ptr.unique();    //返回是否唯一
    
    • weak_ptr详解:
      • 解决:两个shared_ptr循环引用的问题
      • 解决:想要共享但是不想拥有的状况
    std::shared_ptr<std::string> strPtr;
    std::weak_ptr<std::string> strWPtr = strPtr;
    auto newPtr = strWPtr.lock();    //将WPtr升级为Ptr
    strWPtr.expired();    //如果Wptr有共享对象,返回True,速度快于use_count
    strWPtr.use_count();    //返回Ptr的共享个数
    
    • shared_ptr的高级用法:将this指针转化为shared_ptr类型交由回调函数处理
    class Find : public std::enable_shared_from_this<Find>
    {
        ...
        ...
        auto thisPtr = shared_from_this();
    }
    
    • 使用Function Object作为上述Smart Pointer的删除器,以减少函数运行期的开销
    • <cstring>常用函数:
    memchr(const void* ptr,int c,size_t len);
    memcmp(const void* ptr1,const void* ptr2,size_t len);
    memcpy(void* toPtr,const void* fromPtr,size_t len);
    memmove(void* toPtr,const void* fromPtr,size_t len);
    memset(void* ptr,int c,size_t len);
    

    STL概述

    • 安插型迭代器 Insert Iterator
      • Back_Insert:安插于容器的最末端
      • Front_Insert:安处于容器的最前端
      • General_Insert:安插于容器的指定位置
        下述例程将list中的所有元素安插到vector的最末端:
    list<int> list{1,2,3,4,5,6,7,8,9};
    vector<int> vector;
    std::copy(list.begin(),list.end(),back_inserter(vector));
    
    back_inserter(container);//尾安插
    front_inserter(container);//头安插
    inserter(container,pos);//pos安插
    
    • 串流迭代器 Stream Iterator
    std::vector<std::string> vecStream;
    std::copy(std::istream_iterator<std::string>(std::cin),std::istream_iterator<std::string>(),std::back_inserter(vecStream));
    std::sort(vecStream.begin(),vecStream.end());
    std::unique_copy(vecStream.cbegin(),vecStream.cend(),std::ostream_iterator<std::string>(std::cout,"
    "));
    
    • 任何“以迭代器访问容器“的泛型算法,都无法通过通过迭代器调用容器类所提供的任何成员函数。
    • 在任何情况下,优先选用容器本省的成员函数,其次才是泛型算法
    • Move迭代器
    std::list<std::string> s;
    ...
    std::vector<std::string> vec(s.begin(),s.end());    //copy
    std::vector<std::string> vec(make_move_iterator(s.begin(),s.end()));    //move
    
    • 单个判断式Predicate:会返回bool类型的数据作为排序准则或者查找准则。
    • 双参判断式:Binary Predicate
  • 相关阅读:
    Spring Boot (20) 拦截器
    Spring Boot (19) servlet、filter、listener
    Spring Boot (18) @Async异步
    Spring Boot (17) 发送邮件
    Spring Boot (16) logback和access日志
    Spring Boot (15) pom.xml设置
    Spring Boot (14) 数据源配置原理
    Spring Boot (13) druid监控
    Spring boot (12) tomcat jdbc连接池
    Spring Boot (11) mybatis 关联映射
  • 原文地址:https://www.cnblogs.com/ukernel/p/9191125.html
Copyright © 2011-2022 走看看