1. 程式人生 > >04_仿函式、去轉義字元、using 別名、智慧指標、多執行緒、斷言

04_仿函式、去轉義字元、using 別名、智慧指標、多執行緒、斷言

【目錄】

一、 仿函式 2
1、 仿函式, 2
二、 轉義字元 2
1、 去掉轉義字元R”()” 2
三、 using 別名 (與c的typedef相同) 3
四、 模板超程式設計 3
五、 智慧指標 4
1、 auto_ptr—–依賴於原生的指標 4
2、 C11新型智慧指標(推薦使用)—unique_ptr 5
六、 多執行緒 5
七、 靜態斷言 6

一、仿函式

  1、仿函式::就是使一個類的使用看上去像一個函式。其實現就是類中實現一個operator(),這個類就有了類似函式的行為,就是一個仿函式類了。
    ①.建立一個函式指標,引用一個結構體內部或者一個類內部的公有函式using namespace std::placeholders;

#include<iostream>
#include<functional>//處理函式

using namespace std::placeholders;

struct MyStruct {

    void add(int a) {
        std::cout<<a<<std::endl ;
    }
    void add1(int a,int b) {
        std::cout<<a+b<<std::endl ;
    }
    void add2(int a,int b,int
c) { std::cout<<a+b+c<<std::endl ; } } ; int main( int argc , char** argv ) { MyStruct my ; /*仿函式,建立一個函式指標,引用一個結構體內部或者一個類內部的公有函式*/ /*auto自動變數,地址,函式指標,bind繫結 **第一個引數引用內部函式,繫結一個實體物件*/ auto fun1 = bind( &MyStruct::add , &my , _1 ) ; fun1(2) ; auto
fun2 = bind( &MyStruct::add1 , &my , _1 ,_2 ) ; fun2( 5 , 10 ) ; auto fun3 = bind( &MyStruct::add2 , &my , _1 ,_2 , _3 ) ; fun3( 6 , 7 ,8 ) ; /*---------------------------------*/ MyStruct struct1; /*建立函式指標,類結構體,資料私有,程式碼共享*/ /*函式通過呼叫,呼叫需要傳遞物件名進行區分*/ void(MyStruct::*p)(int a) = &MyStruct::add; (my.add)(3) ; (my.*p)(3) ; std::cin.get() ; return 0 ; }

二、轉義字元

  1、去掉轉義字元R()
    ①.注:放在括號中的內容將被去掉轉義字元

R“(E:\Langue\C++\2014傳智播客C++\02_C++就業\20140816\vedio)”

三、using 別名 (與c的typedef相同)

#include <iostream>

namespace space   //隔離模板,避免衝突
{
    template<class T> using ptr = T*; //模板的簡寫
}

int add(int a, int b)
{

    return a + b;
}
typedef  int(*ADD)(int a, int b);
using  FUNC = int (*)(int a, int b);
//別名
using  co = std::ios_base::fmtflags;
//using只可以用於簡寫資料型別

void main()
{
    ADD p=add;
    std::cout<<p(1, 2)<<std::endl;
    FUNC func = add;
    std::cout << func(1, 2) << std::endl;
    //space::ptr<int> pint(new int(15));
/*指向int型別的指標*/
    //std::cout << *pint << "   " << pint << std::endl;

    std::cin.get();
}

四、模板超程式設計

#include<iostream>
//模板元吧執行時消耗的時間,在編譯期間優化

template<int N>
struct data {
    enum a{ res = data<N - 1>::a::res + data<N - 2>::a::res };
};

template<>
struct data<1> {
    enum a{res =1};
};

template<>
struct data<2> {
    enum a{res= 1 };
};

//1  1  2  3  5  7

int getdata(int n) {
    if (n==1 || n==2)   {
        return 1;
    } 
    else    {
        return getdata(n - 1) + getdata(n - 2);
    }
}

void main() {
    const int myint = 40;
    int num = data<myint>::res ; //<>內部不可以有變數
    std::cout << num << std::endl;

    std::cout << getdata(40) << std::endl;

    std::cin.get();
}
//主要思想
//
//利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構,模板元程式則由編譯器在編譯期解釋執行。
//
//優劣及適用情況
//
//通過將計算從執行期轉移至編譯期,在結果程式啟動之前做盡可能多的工作,最終獲得速度更快的程式。也就是說模板超程式設計的優勢在於:
//
//1.以編譯耗時為代價換來卓越的執行期效能(一般用於為效能要求嚴格的數值計算換取更高的效能)。通常來說,一個有意義的程式的執行次數(或服役時間)總是遠遠超過編譯次數(或編譯時間)。
//
//2.提供編譯期型別計算,通常這才是模板超程式設計大放異彩的地方。
//
//模板超程式設計技術並非都是優點:
//
//1.程式碼可讀性差,以類模板的方式描述演算法也許有點抽象。
//
//2.除錯困難,元程式執行於編譯期,沒有用於單步跟蹤元程式執行的偵錯程式(用於設定斷點、察看資料等)。程式設計師可做的只能是等待編譯過程失敗,然後人工破譯編譯器傾瀉到螢幕上的錯誤資訊。
//
//3.編譯時間長,通常帶有模板元程式的程式生成的程式碼尺寸要比普通程式的大,
//
//4.可移植性較差,對於模板超程式設計使用的高階模板特性,不同的編譯器的支援度不同。

五、智慧指標(自動釋放記憶體)

  1、auto_ptr—–依賴於原生的指標

#include <iostream>

void main1() {

    for (int i = 0; i < 10000000; i++) {
        double *p = new double;//為指標分配記憶體
        std::auto_ptr<double> autop(p);
        //建立智慧指標管理指標p指向記憶體
        //智慧指標 
        //delete p;
    }
    std::cin.get();
}

  2、C11新型智慧指標(推薦使用)—unique_ptr

#include<iostream>
#include<memory>   //記憶體

void main() {
    for (int i = 0; i < 10000000;i++) {
        //新型指標,新型的陣列

        std::unique_ptr<double> pdb(new double);

        //double *p = new double;
    }
    std::cin.get();
}

六、多執行緒

#include <thread>
#include<iostream>
#include<windows.h>
#include<vector>

using namespace std;
using namespace std::this_thread;

void msg() {
    MessageBoxA(0, "12345", "678910", 0);
}
void msgA(int num) {
    std::cout << get_id() << "  num=   " << num << std::endl;
}

void main1() {

    // thread::hardware_concurrency檢視計算機執行緒
    auto n = thread::hardware_concurrency();
    std::cout << n << std::endl;
    //獲取當前執行緒編號
    std::cout << "thread=" << get_id() << std::endl;


   thread thread1(msg);//建立多執行緒
   thread thread2(msg);
   thread1.join();//開始執行
   thread2.join();

    std::cin.get();
}

void main2() {

    vector<thread *> threads;
    for (int i = 0; i < 10; i++)    {
        threads.push_back(new thread(msg));//建立執行緒
    }

    for (auto th : threads)     {
        th->join();
    }

    std::cin.get();
}
void main() {

    vector<thread *> threads;
    for (int i = 0; i < 10; i++)    {
        threads.push_back(new thread(msgA,i));//建立執行緒
    }

    for (auto th : threads)     {
        th->join();
    }

    std::cin.get();
}

七、靜態斷言

#include <stdio.h>
#include<assert.h>
#include<iostream>

using namespace std;
#define  N 10

void main() {
    int num = 100;
    cout << num << endl;
    cout << __FILE__ << endl;
    cout << __LINE__ << endl;
    cout << __DATE__ << endl;
    cout << __TIME__ << endl;
    cout << __FUNCTION__ << endl;

    cin.get();
}
#define M
void main1() {
   char  num = 10;
    //位元組>4
#ifdef  M
  // static_assert(sizeof(num) >= 4, "yincheng error");
#endif

    //除錯程式碼,迅速程式碼錯誤在哪一行

}

//regex pattern("[[:digit:]]",regex_constants::extended);
    //std::locale::global(std::locale("Chinese"));
    //setlocale(LC_ALL, "chs");
    /*
    std::string s ("我是你爹,你把");  
    std::smatch m;  
    std::regex e ("你");   // matches words beginning by "sub" 

    while (std::regex_search (s,m,e)) {  
        for (auto x=m.begin();x!=m.end();x++)   
            std::cout << x->str() << ":: ";  
            std::cout << "--> ([^ ]*) match " << m.format("$0") <<std::endl;  
            s = m.suffix().str();  
    }  
    */