C++精華基礎

來源:互聯網
上載者:User

  八進位:以數字0開頭
  十六進位:以0x或者0X開頭

Q:如何? 字串<=>各種數字類型 的轉換?                                                                              
A:通用的方法:sprintf 實現數字=>字串
              sscanf  實現字串=>數字
  其他方法:字串=>數字 atoi atof atol分別實現字串到int、double、long的轉換
            數字=>字串 _itoa _ltoa分別實現int、long到字串的轉化,
                         其中double=>string比較特殊,有_ecvt _fcvt _gcvt
  如果使用MFC的CString類,還可以使用.Format方法。

Q:各種基礎資料型別 (Elementary Data Type)的範圍和精度如何?                                                                                   
A:Type Name       Bytes   Other Names        Range of Values                                                           
  int             *       signed (int)       System dependent                                                          
  char            1       signed char        -128 to 127                                                               
  long            4       (signed) long int  -2,147,483,648 to 2,147,483,647
  float           4       none               3.4E +/- 38 (7 digits)
  double          8       none               1.7E +/- 308 (15 digits)
  long double     10      none               1.2E +/- 4932 (19 digits)

 Q:有關模板template                                                                                                     
A:模板的定義和實現必須都放在標頭檔裡!如果你不幸把定義和實現分別寫在了
  MyTemplate.h和MyTemplate.cpp裡,那麼請在#include "MyTemplate.h"後
  加一句#include "MyTemplate.cpp"

Q:如何擷取時間?精度如何?                                                                                             
A:1 使用time_t time( time_t * timer ) 精確到秒
  2 使用clock_t clock() 得到的是CPU時間 精確到1/CLOCKS_PER_SEC秒
  3 計算時間差使用double difftime( time_t timer1, time_t timer0 )
  4 使用DWORD GetTickCount() 精確到毫秒
  5 如果使用MFC的CTime類,可以用CTime::rmat方法。

Q:各種基礎資料型別 (Elementary Data Type)的範圍和精度如何?                                                                                   
A:Type Name       Bytes   Other Names        Range of Values                                                           
  int             *       signed (int)       System dependent                                                          
  char            1       signed char        -128 to 127                                                               
  long            4       (signed) long int  -2,147,483,648 to 2,147,483,647
  float           4       none               3.4E +/- 38 (7 digits)
  double          8       none               1.7E +/- 308 (15 digits)
  long double     10      none               1.2E +/- 4932 (19 digits)
  //資料來源:MSDN Oct2001,但是實際測試有些並不符合

Q:有關模板template                                                                                                     
A:模板的定義和實現必須都放在標頭檔裡!如果你不幸把定義和實現分別寫在了
  MyTemplate.h和MyTemplate.cpp裡,那麼請在#include "MyTemplate.h"後
  加一句#include "MyTemplate.cpp"

Q:如何擷取時間?精度如何?                                                                                             
A:1 使用time_t time( time_t * timer ) 精確到秒
  2 使用clock_t clock() 得到的是CPU時間 精確到1/CLOCKS_PER_SEC秒
  3 計算時間差使用double difftime( time_t timer1, time_t timer0 )
  4 使用DWORD GetTickCount() 精確到毫秒
  5 如果使用MFC的CTime類,可以用CTime::GetCurrentTime() 精確到秒
  6 要擷取高精度時間,可以使用
    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)                                                         
    擷取系統的計數器的頻率
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)                                                    
    擷取計數器的值
    然後用兩次計數器的差除以Frequency就得到時間。
  7 還有David的文章中提到的方法:
    Multimedia Timer Functions
    The following functions are used with multimedia timers.
    timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime

Q:有關模板template                                                                                                     
A:模板的定義和實現必須都放在標頭檔裡!如果你不幸把定義和實現分別寫在了
  MyTemplate.h和MyTemplate.cpp裡,那麼請在#include "MyTemplate.h"後
  加一句#include "MyTemplate.cpp"

 

Q:如何擷取時間?精度如何?                                                                                             
A:1 使用time_t time( time_t * timer ) 精確到秒
  2 使用clock_t clock() 得到的是CPU時間 精確到1/CLOCKS_PER_SEC秒
  3 計算時間差使用double difftime( time_t timer1, time_t timer0 )
  4 使用DWORD GetTickCount() 精確到毫秒
  5 如果使用MFC的CTime類,可以用CTime::GetCurrentTime() 精確到秒
  6 要擷取高精度時間,可以使用
    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)                                                         
    擷取系統的計數器的頻率
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)                                                    
    擷取計數器的值
    然後用兩次計數器的差除以Frequency就得到時間。
  7 還有David的文章中提到的方法:
    Multimedia Timer Functions
    The following functions are used with multimedia timers.
    timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime
    timeGetTime/timeKillEvent/TimeProc/timeSetEvent  精度很高

Q:有關指標和指標的引用                                                                                                 
A:指標的引用是合法的,引用的指標是非法的。
  聲明的時候要用 TYPE * & variable,不能用TYPE & * variable

Q:有關隨機數的問題                                                                                                     
Q1:如何得到給定範圍的隨機數?
A1:如要得到[a,b)區間的隨機數,那麼使用 ( rand()%(b-a) ) + a 就可以
Q2:我用rand()得到的隨機數序列怎麼每次都是一樣的?
A2:rand()產生的是偽隨機數,所以如果想每次產生不同的序列,需要給定隨機數生
   成的種子,使用函數void srand(unsigned int seed),一般都使用
   srand((unsign時間,可以使用
    BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)                                                         
    擷取系統的計數器的頻率
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)                                                    
    擷取計數器的值
    然後用兩次計數器的差除以Frequency就得到時間。
  7 還有David的文章中提到的方法:
    Multimedia Timer Functions
    The following functions are used with multimedia timers.
    timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime
    timeGetTime/timeKillEvent/TimeProc/timeSetEvent  精度很高

Q:有關指標和指標的引用                                                                                                 
A:指標的引用是合法的,引用的指標是非法的。
  聲明的時候要用 TYPE * & variable,不能用TYPE & * variable

Q:有關隨機數的問題                                                                                                     
Q1:如何得到給定範圍的隨機數?
A1:如要得到[a,b)區間的隨機數,那麼使用 ( rand()%(b-a) ) + a 就可以
Q2:我用rand()得到的隨機數序列怎麼每次都是一樣的?
A2:rand()產生的是偽隨機數,所以如果想每次產生不同的序列,需要給定隨機數生
   成的種子,使用函數void srand(unsigned int seed),一般都使用
   srand((unsigned)time(NULL));這種方式
Q3:如何得到隨機的浮點數?
Q3:沒有太好的方法,可以試試rand()/double(RAND_MAX)以得到0~1之間的隨機數

Q:如何使用一些數學常量?                                                                                               
Q1:PI
A1:用double表示有15位,用long double表示有19位,
   pi = 3.141592653589793或者const long double pi = 2*acos(0);
Q2:E
A2:不會吧?exp()你都不會用嗎?
   還有,log()是以e為底的自然對數,log10是以10為底的常用對數

Q:cout如何控制輸出格式?                                                                                               
A:1 數字進位:使用hex、dec、oct控制輸出數位進位
  2 如何對齊:使用setw控制寬度
  3 設定精度:使用setprecision控制輸出精度
  4 填充字元:使用setfill控制填充字元
  5 控制格式:使用setioflags(ios_base::fmtflags mask)來控制
              常用的有ios::fixed固定的浮點顯示
                      ios::scientific指數表示
                      ios::left / ios::right 左/靠右對齊
                      ios::skipws忽略前置空白
            signed)time(NULL));這種方式
Q3:如何得到隨機的浮點數?
Q3:沒有太好的方法,可以試試rand()/double(RAND_MAX)以得到0~1之間的隨機數

Q:如何使用一些數學常量?                                                                                               
Q1:PI
A1:用double表示有15位,用long double表示有19位,
   pi = 3.141592653589793或者const long double pi = 2*acos(0);
Q2:E
A2:不會吧?exp()你都不會用嗎?
   還有,log()是以e為底的自然對數,log10是以10為底的常用對數

Q:cout如何控制輸出格式?                                                                                               
A:1 數字進位:使用hex、dec、oct控制輸出數位進位
  2 如何對齊:使用setw控制寬度
  3 設定精度:使用setprecision控制輸出精度
  4 填充字元:使用setfill控制填充字元
  5 控制格式:使用setioflags(ios_base::fmtflags mask)來控制
              常用的有ios::fixed固定的浮點顯示
                      ios::scientific指數表示
                      ios::left / ios::right 左/靠右對齊
                      ios::skipws忽略前置空白
                      ios::uppercase / ios::lowercase 十六進位大/小寫輸出
  別忘了加上標頭檔:#include <iomanip.h>

Q:如何建立二維數組?                                                                                                   
A:方法1
  TYPE * * arrayName;
  arrayName = new TYPE * [SIZE_1];
  for ( i=0 ; i<SIZE_1 ; i++ )
  {
      arrayName[i] = new TYPE[SIZE_2];
  }
  使用完畢後不要忘記釋放記憶體:
  for ( i=0 ; i<SIZE_1 ; i++ )                                                                                         
  {
      if ( arrayName[i]!=NULL ) delete [] arrayName[i];
  }
  if ( arrayName!=NULL ) delete [] arrayName;
  備忘:在使用這種方法建立的數組時,如果需要把數組傳遞給函數的時候,
        可以傳遞TYPE **的指標,但是如果使用TYPE arrayName[][]建立數組
        無論幾維數組都是TYPE * 的指標,如果試圖傳遞TYPE **的指標,會報告錯誤
  方法2(推薦)
  參見kirbyzhou《關於動態數組》一文

Q:如何使用複數類?                                                                                                     
A:#include <complex>
  using name維數組?                                                                                                   
A:方法1
  TYPE * * arrayName;
  arrayName = new TYPE * [SIZE_1];
  for ( i=0 ; i<SIZE_1 ; i++ )
  {
      arrayName[i] = new TYPE[SIZE_2];
  }
  使用完畢後不要忘記釋放記憶體:
  for ( i=0 ; i<SIZE_1 ; i++ )                                                                                         
  {
      if ( arrayName[i]!=NULL ) delete [] arrayName[i];
  }
  if ( arrayName!=NULL ) delete [] arrayName;
  備忘:在使用這種方法建立的數組時,如果需要把數組傳遞給函數的時候,
        可以傳遞TYPE **的指標,但是如果使用TYPE arrayName[][]建立數組
        無論幾維數組都是TYPE * 的指標,如果試圖傳遞TYPE **的指標,會報告錯誤
  方法2(推薦)
  參見kirbyzhou《關於動態數組》一文

Q:如何使用複數類?                                                                                                     
A:#include <complex>
  using namespace std;                                                                                                 
  complex<TYPE>就好了

Q:常見資料結構,如鏈表等等,有現成能用的嗎?                                                                           
A:STL(Standard Template Library)裡有很多東西,
  如heap、list、map、queue、set、stack、string、vector……

Q:>>和> >的二義性問題                                                                                                  
A:舉例說明:vector<pair<CString,CString>> Group就是錯的
        而:vector<pair<CString,CString> > Group就是對的
        無論幾維數組都是TYPE * 的指標,如果試圖傳遞TYPE **的指標,會報告錯誤
  方法2(推薦)
  參見kirbyzhou《關於動態數組》一文

Q:如何使用複數類?                                                                                                     
A:#include <complex>
  using namespace std;
  complex<TYPE>就好了

Q:常見資料結構,如鏈表等等,有現成能用的嗎?                                                                           
A:STL(Standard Template Library)裡有很多東西,
  如heap、list、map、queue、set、stack、string、vector……
  using namespace std;                                                                                                 
  complex<TYPE>就好了

Q:常見資料結構,如鏈表等等,有現成能用的嗎?                                                                           
A:STL(Standard Template Library)裡有很多東西,
  如heap、list、map、queue、set、stack、string、vector……

Q:>>和> >的二義性問題                                                                                                  
A:舉例說明:vector<pair<CString,CString>> Group就是錯的
        而:vector<pair<CString,CString> > Group就是對的

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.