1. 程式人生 > 其它 >2021.07.14牛客學習

2021.07.14牛客學習

牛客學習知識點

  1. c語言逗號運算子,這個經常會不注意,但平時經常寫的int a,b=9;肯定是給b賦值,所以cout<<(a,b);肯定是輸出b

  2. vector迭代器erase掉一個元素會使後面的所有迭代器失效,所以要使用一個迭代器去接返回值

    it = v_obj.erase(it++);
    
  3. std::setw :需要填充多少個字元,預設填充的字元為' '空格

    std::setfill:設定std::setw將填充什麼樣的字元,如:std::setfill('*')

    std::setbase(n):將輸出資料轉換為n進位制

    std::setprecision():控制輸出流顯示浮點數的數字個數,C++預設的流輸出數值有效位是6。

    #include <iostream>
    #include <iomanip>
    #include <sstream>
    #include <shlobj.h>
     
     
    //AppData
    std::wstring GetUserAppDataDir()
    {
        std::wstring appdata;
        wchar_t buffer[MAX_PATH];
        ::ZeroMemory(buffer, MAX_PATH*sizeof(wchar_t));
        if (::SHGetSpecialFolderPath(NULL, buffer, CSIDL_APPDATA, NULL))
            appdata = buffer;
     
        if (appdata.substr(appdata.length() - 1) != L"\\")
        {
            appdata.append(L"\\");
        }
        return appdata;
    }
     
    //生成日誌檔案路徑
    std::wstring GetLogFileName()
    {
        SYSTEMTIME sysTime;
        ::GetLocalTime( &sysTime );
     
        std::wstringstream logFileName;
        logFileName << GetUserAppDataDir().c_str() << L"_"
            << sysTime.wYear << L"_"
            << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wMonth << L"_"
            << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wDay << L"_"
            << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wHour << L"_"
            << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wMinute << L"_"
            << std::setw( 2 ) << std::setfill( L'0' ) << sysTime.wSecond << L".log";
        return logFileName.str();
    }
    //字串轉數字
    template <class T> T to_num( const char* s )
    {
        T tmp(0);
        std::istringstream is(s);
        is >> std::setbase(10) >> tmp;//setbase(n):將輸出資料轉換為n進位制
        if(is.fail())
        {
            return 0;
        }
        return tmp;
    };
    //測試程式碼
    int main()
    {
        int a = 1;
        int b = 2;
        char c = '$';
        //輸出:   1
        std::cout << std::setw( 4 ) << a << std::endl;
        //輸出:$$$1
        std::cout << std::setw( 4 ) << std::setfill( c ) << a << std::endl;
        //輸出:$$$12
        std::cout << std::setw( 4 ) << std::setfill( c ) << a << b << std::endl;
        //輸出日誌檔案路徑
        std::wcout << GetLogFileName().c_str() << std::endl;
        std::cout << "\n" << std::endl;
        //std::setbase()的使用
        int num = to_num<int>("1234");
        long ldata = to_num<long>("123456");
        std::cout << num << std::endl;
        std::cout << ldata << std::endl;
        std::cout << "\n" << std::endl;
        std::cout << "255(2進位制): " << std::setbase(2) << 255 << std::endl;//二進位制輸出
        std::cout << "255(8進位制): " << std::setbase(8) << 255 << std::endl;//八進位制輸出
        std::cout << "255(16進位制): " << std::setbase(16) << 255 << std::endl;//十六進位制輸出
        //setprecision()的作用: 控制輸出流顯示浮點數的數字個數(C++預設的流輸出數值有效位是6)
        //如果與setiosflags(ios::fixed)合用,可以控制小數點右邊的數字個數。
        //setiosflags(ios::fixed)是用定點方式表示實數。
        //setiosflags(ios::scientific)是用指數方式表示實數。
        std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(8) << 12.123456 << std::endl;
        //如果與setiosflags(ios::scientific)合用,可以控制指數表示法的小數位數。
        //在用浮點表示的輸出中,setprecision(n)表示有效位數。
        //在用定點表示的輸出中,setprecision(n)表示小數位數。
        system("pause");
        return 0;
    }
    
  4. 派生類無論是public、protected、private繼承,都能夠訪問和修改基類的public和protected成員,而派生類物件僅當public繼承時才能夠訪問和修改基類成員,因此在基類中定義的protected成員在私有繼承的派生類中可訪問可修改的