zoukankan      html  css  js  c++  java
  • c++ 11 key note

    c++11
    c++11

    常数初始化,使用constexpr关键字

        constexpr in getNum(){return 4};
        int some_arr[getNum + 3];   
    

    初始化列表

    //std::initializer_list
    auto list = {1,2,35,57}; //list是一个initializer_list容器
    
    
    class InitClass
    {
        public:
        InitClass(std::initializer_list<int> list);
    }
    
    InitClass var = {0,12,33};
    
    //标准库容器
    
    std::vector<string> arr = {"apple","google","adobe"};
    

    统一初始化

        struct IDVO
        {
            string name;
            int age;
        }   
        // 自动将const char* 转成string
        IDVO var = {"Steven",667};
    
        IDVO getById()
        {
            return {"Jobs",78};
        }
        //统一初始化不会取代构造函数
    

    自动类型推导

    //使用auto关键字实现参数类型推导
    
    auto a = 1;       // a是int类型
    auto b = "hello"; // b是const char *
    
    int abc(int a,int b,int c)
    {
        return a + b + c;
    }
    auto bindFuc = std::bind(abc, std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);
    
    //注意下面的写法
    
    auto myarr[2] = {1,2};//错误,编译器报错
    int myarr1[2] = {1,2};//正确
    decltype(myarr1) myarr2; //正确
    
    
    //还可以向下面这样使用
    
    std::vector<string> arr = {"apple","google","adobe"};
    
    for (auto ite = arr.begin();ite != arr.end(),ite++)
    {
    
    }
    
    
    //与decltype的配合用法
    
    int sint = 1;
    decltype(sint) bint = 4;//
    
    auto d = bint;//
    auto c = 0;
    
    decltype(c) e; //e为int类型
    decltype((c)) f = e; // f为int&类型,
    

    for循环

    int myarr3[3] = {1,2,3};
    
    for (int &x : myarr3)
    {
    
    }
    
    //
        vector<string> arrVec = {"apple","google","adobe"};
        for (const auto &x : arrVec)
        {
            printf("%s",x.c_str());
        }
    

    Lambda函数

    //一个lambda实例, 参数在()中定义;返回值-> ,无返回值时可以去掉 ;函数体{}
    
        auto sumFuc = [](int x,int y) ->int { return x+ y;};
        int ret = sumFuc(1,222);
    
    //以下定义了一个function
        std::function<int(int,int)> sumFuc1 =[](int x,int y) ->int { return x+ y;};
        int ret1 = sumFuc1(1,222);
    
    
        //[] 内部定义了一个lambda内部如何使用外部变量
        []  表示不能以任何形式使用外部变量
        [=] 表示任何被使用的外部参数将以传值形式加以使用
        [&] 表示任何被使用的外部参数将以引用形式加以使用
    
        //下面是一个错误的例子,lambda无法直接使用外部ret1变量
        auto sumfuc2 = [](int z)->int
        {
            return ret1 + z;
        };
        //下面这个写法就是对的
        auto sumfuc2 = [&](int z)->int
        {
            return ret1 + z;
        };
        //可以使用不同的传值方式比如,ret显示的以引用使用,ret1则是传值方式
    
        auto sumFunc3 = [&ret,ret1]()->int
        {
    
            return ret + ret1;
        };
    
        cocos2d-x中,很多地方可以使用lambda表示,如触摸的onTouchBegan方法我们可以这么写
            auto touchListener = EventListenerTouchOneByOne::create();
        touchListener->onTouchBegan = [](Touch *touch, Event *event)->bool
        {
            return true;
        };
    

    std::bind 和std::function

    std::function 可以绑定到全局函数/类静态函数,如果要绑定到类的实例的函数则使用std::bind;
    
    std::bind 可以绑定lambda表达式;
    
    注意 std::bind无法绑定重载函数(同名函数)
    
    -----
    

    nullptr和NULL

    //关键字nullptr用来将空指针和整数0区分开来;nullptr的类型是nullptr_t,而NULL依然被定义为0
    //比如有两个函数
    
    void foo(char *); //<1>
    void foo(int);    //<2>
    
    foo(nullptr) //调用<1>
    foo(0)   //调用 <2>
    
    //0依然可以代表空指针
    

    字符串

    c++11支持三种unicode编码方式:UTF-8;UTF-16和UTF-32. 新加入两种类型的字符类别char16_t和char32_t,以支持UTF-16和UTF-32

        const char str8[] = "c++11标准";
        int len = strlen(str8); // 11
    
        //u8表示char ;u表示char16_t,U表示char32_t
    
        const char16_t str16[] = u"c++11标准";
        std::u16string ss16(str16);  //引入u16string
        //获取u16string长度
        int l = ss16.length();  // 7
    
        //还可以用下面这个方法获取长度
        int l16 = sizeof(str16)/sizeof(str16[0]])
    
        // utf-8和utf-16的相互转化
            char str8_str[] = "hi墨白科技";
        std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> utf16conv;
        //char 转 u16
        u16string str16_str = utf16conv.from_bytes(str8_str);
        int l16 = str16_str.length();
        const char16_t *str16_ss =str16_str.c_str();
        // u16string转string
        string c8str = utf16conv.to_bytes(str16_ss);
    

    多线程

    //多线程
    std::thread t;
    
  • 相关阅读:
    [LeetCode] Remove Duplicates from Sorted List
    [LeetCode] Substring with Concatenation of All Words
    [LeetCode] Partition List
    [LeetCode] Reverse Nodes in kGroup
    [LeetCode] Remove Duplicates from Sorted List II
    [LeetCode] Reverse Linked List II
    [LeetCode] Text Justification
    [LeetCode] Swap Nodes in Pairs
    (转)介绍下Nuget在传统Asp.net项目中的使用
    Entity Framework中的Migrations
  • 原文地址:https://www.cnblogs.com/howeho/p/4156479.html
Copyright © 2011-2022 走看看