]C++精华基础贴[水木清华]
發信人: CDRAGON (CDRAGON), 信區: CPlusPlus
標? 題: 基礎知識
發信站: BBS 水木清華站 (Mon Nov 20 13:03:14 2006), 站內
? 八進制:以數字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:各種基本數據類型的范圍和精度如何????????????????????????????????????????????????????????????????????????????????????
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::rmat方法。
Q:各種基本數據類型的范圍和精度如何????????????????????????????????????????????????????????????????????????????????????
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就是對的
--
※ 修改:·CDRAGON 于 Nov 21 18:17:21 修改本文·[FROM: 59.66.132.*]
※ 來源:·BBS 水木清華站 smth.edu.cn·[FROM: 59.66.132.*]
總結
以上是生活随笔為你收集整理的]C++精华基础贴[水木清华]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北大教授雷奕安质疑《流浪地球》的69个不
- 下一篇: InstallShield-Limite