C/C++中gets和cin.getline()效率問題
在做演算法題的時候,很多時間需要用到取一行的資料,在對比了C語言的gets函式與C++ STL庫中的cin.getline()函式之後,發現gets的執行效率更高,造成這一現象的主要原因:
應該是
cin.getline:需要傳入第二個長度引數,然後在檢測的時候,需要多個傳參以及在逐個檢測字元時需要檢測當前位置是否超過傳進來的長度引數值
gets():則是直接跑,一直跑到遇到換行或者EOF。少了個長度檢測長度
相對來說各有優缺點
cin.getline() 更加靈活,可控制傳入的長度
而gets可能在使用者輸入不正確的時候,一般即一直沒輸入換行或者EOF字元,會超過一開始申請的記憶體空間,而導致記憶體溢位問題。
而前者的優點則是可傳入固定大小,從而規避這個問題。
但這樣做的同時也產生了一個明顯缺點就是多了個長度判斷,導致CPU運算量相對於gets來說增大了,在競賽中,如果題目規定了輸入長度,或者範圍,而且題目保證輸入是正常值(其實競賽中後臺檢測資料一般也是嚴格篩選過後的),為了保證題目用時,應更偏向於使用gets,節約時間,在一個8000+行的資料,每行資料字元總量不超過25的時候,gets比cin.getline快了近50ms,詳細資料沒測試,但差距還是有點明顯的。
但在正規專案中,如果輸入資料,char*str中資料的長度不固定,或者說是不確定的時候,申請了固定儲存的記憶體空間,則應偏向使用cin.getline,因為這相對於gets來說更安全,可減少出現記憶體溢位問題或者出現其他bug的風險。
cin.getline應該就差不多等同於:
cin.getline(c,length);
for(int i=0;i<length;i++)c[i]=getchar();
如本文內容理解有錯,望糾正。