zoukankan      html  css  js  c++  java
  • C++11新特性

    1、统一的初始化方法

    int arr[3]{1, 2, 3};
    vector<int> iv{1, 2, 3};
    map<int, string> mp{{1, "a"}, {2, "b"}};
    string str{"Hello World"};
    int * p = new int[20]{1,2,3};
    struct A {
    int i,j; A(int m,int n):i(m),j(n) { }
    };
    A func
    (int m,int n ) { return
    {m,n}; }
    int main() { A * pa = new A {3,7}; }
    统一的初始化方法

    2、成员变量默认初始值

    class B {
    public:
    int m = 1234;
    int n;
    };
    int main() {
    B b
    ;
    cout << b.m << endl; //输出 1234
    return 0;
    }
    成员变量默认初始值

    3、auto 关键字

    4、decltype关键字

    求表达式的类型

    int i;
    double t;
    struct A { double x; };
    const A* a = new A();
    decltype(a) x1; // x1 is A *
    decltype(i) x2; // x2 is int
    decltype(a->x) x3; // x3 is double
    decltype((a->x)) x4 = t; // x4 is double&

    5、智能指针shared_ptr

    头文件<memory>

    通过shared_ptr的构造函数,可以让shared_ptr对象托管一个new运算符返回的指针。

    shared_ptr<T> ptr(new T); // T 可以是 int ,char, 类名等各种类型

    此后ptr就可以像 T* 类型的指针一样来使用,即 *ptr 就是用new动态分配的那个对象,而且不必操心释放内存的事。

    多个shared_ptr对象可以同时托管一个指针,系统会维护一个托管计数。当无shared_ptr托管该指针时,delete该指针。

    shared_ptr对象不能托管指向动态分配的数组的指针,否则程序运行会出错。

    6、空指针nullptr

    7、基于范围的for循环

    #include <iostream>
    #include <vector>
    using namespace std;
    struct A { int n; A(int i):n(i) { } };
    int main() {
      int ary[] = {1,2,3,4,5};
      for(int & e: ary)
        e*= 10;
      for(int e : ary)
        cout << e << ",";
      cout << endl;
      vector<A> st(ary,ary+5);
      for( auto & it: st)
        it.n *= 10;
      for( A it: st)
        cout << it.n << ",";
      return 0;
    }

    8、右值引用和move语义

    右值:一般来说,不能取地址的表达式就是右值, 能取地址的就是左值。主要目的是提高程序运行的效率,减少需要进行深拷贝的对象进行深拷贝的次数。

    class A { };
    A & r = A(); // error , A()是无名变量,是右值
    A && r = A(); //ok, r 是右值引用

    9、无序容器(哈希表)

    头文件<unordered_map>

    使用方法与map相同。哈希表插入和查询的时间复杂度几乎是常数。

    10、正则表达式

    头文件 <regex>

    #include <iostream>
    #include <regex> //使用正则表达式须包含此文件
    using namespace std;
    int main()
    {
     regex reg("b.?p.*k");
     cout << regex_match("bopggk",reg) <<endl; //输出 1, 表示匹配成功
     cout << regex_match("boopgggk",reg) <<endl; //输出 0, 表示匹配失败
     cout << regex_match("b pk",reg) <<endl; //输出 1, 表示匹配成功
     regex reg2("\d{3}([a-zA-Z]+).(\d{2}|N/A)\s\1");
     string correct="123Hello N/A Hello";
     string incorrect="123Hello 12 hello";
     cout << regex_match(correct,reg2) <<endl; //输出 1, 表示匹配成功
     cout << regex_match(incorrect,reg2) << endl; //输出 0, 表示匹配失败
    }

    11、Lambda表达式

    只使用一次的函数对象,不用专门为其写一个类。只调用一次的简单函数,在调用时再写函数体。

    形式:

    [外部变量访问方式说明符](参数表) ->返回值类型
    {
        语句组
    }

    [=] 以传值的形式使用所有外部变量
    [] 不使用任何外部变量
    [&] 以引用形式使用所有外部变量
    [x, &y] x 以传值形式使用,y 以引用形式使用
    [=,&x,&y] x,y 以引用形式使用,其余变量以传值形式使用
    [&,x,y] x,y 以传值的形式使用,其余变量以引用形式使用

    “->返回值类型”也可以没有, 没有则编译器自动判断返回值类型。

    int main()
    {
    int x = 100,y=200,z=300;
    cout << [ ](double a,double b) { return a + b; } (1.2,2.5) << endl;
    auto ff = [=,&y,&z](int n) {
    cout <<x << endl;
    y++; z++;
    return n*n;
    };
    cout << ff(15) << endl;
    cout << y << "," << z << endl;
    }
    Lambda实例
    int a[4] = { 4,2,11,33};
    sort(a,a+4,[ ](int x,int y)->bool { return x%10 < y%10; });
    for_each(a,a+4,[ ](int x) {cout << x << " " ;} ) ;
    Lambda实例&
    未经允许,请勿转载
  • 相关阅读:
    Linux下安装mysql(yum和源码编译两种方式)
    搭建Hadoop集群(centos6.7+hadoop-2.7.3)
    xen虚拟机(Centos6.6)的创建和扩容
    Apache Ranger对HDFS的访问权限控制的原理分析(一)
    Block Token 原理分析
    Hadoop安全机制之令牌
    VS 2012 Unit Test
    java 并发
    图片相关
    cmd出现乱码
  • 原文地址:https://www.cnblogs.com/zhuzhudong/p/10850521.html
Copyright © 2011-2022 走看看