国产一级簧片-国产一极毛片-国产一国产a一级毛片-国产一国产一有一级毛片-91三级视频-91大学生视频

藍(lán)鷗旗下品牌:鷗課學(xué)院
全國(guó)咨詢(xún)電話:13152008057
您的位置: 首頁(yè) > 最新資訊 > 這幾個(gè)編程小技巧,讓你代碼效率提高一個(gè)檔次

這幾個(gè)編程小技巧,讓你代碼效率提高一個(gè)檔次

2018-09-30 藍(lán)鷗
4008人 瀏覽:

  小伙伴們?cè)诰幊踢^(guò)程中

  有的人說(shuō)我敲代碼又不好看還慢

  怎么辦?

  今天小編給大家介紹幾個(gè)編程小技巧

  讓你的代碼迅速提高檔次

  for循環(huán)

  1、for循環(huán)變量初始化

  在c語(yǔ)言中,我們常常這樣使用for語(yǔ)句:

  for (int i = 0; i < strlen(s); i++)

  這看起來(lái)似乎很完美,代碼也很漂亮,讓我們?cè)倏纯戳硪环N寫(xiě)法:

  for (int i = 0, len = strlen(s); i < len; i++)

  二者唯一的不同在于后者用len變量將字符串s的長(zhǎng)度保存了,在條件判斷時(shí)直接將i與len比較。

  第二種方法用一個(gè)額外變量len避免了每次條件判斷都要重復(fù)執(zhí)行函數(shù)strlen(s),而執(zhí)行該函數(shù)是非常耗時(shí)的(假設(shè)字符串的長(zhǎng)度為n,函數(shù)執(zhí)行的復(fù)雜度為O(n)),尤其是當(dāng)for循環(huán)體的語(yǔ)句比較少,字符串比較長(zhǎng)的時(shí)候。

  在很多l(xiāng)eetcode題目中,兩種不同的寫(xiě)法需要的運(yùn)行時(shí)間相差巨大。

  同樣在C++、Java中,這種寫(xiě)法for (int i = 0; i < s.length(); i++),也是不值得推薦的,盡管C++編譯時(shí)期有的編譯器會(huì)將length()函數(shù)用內(nèi)聯(lián)或者一個(gè)確定的變量來(lái)替代,Java也會(huì)將其用“屬性”來(lái)替代,但我仍然傾向于使用后者。

  有意思的是,在Python的語(yǔ)法中,for循環(huán)用這種方式來(lái)表示:

  for i in range(len(s))

  這就避免了重復(fù)去求字符串s的長(zhǎng)度,這種方法既有語(yǔ)義感,又獲得了高性能。

  2、變量定義位置(for循環(huán)內(nèi)部還是外部)

  //內(nèi)部for (int i = 0; i < 10; i++){ string s = ss[i]; ...}//外部string s;for (int i = 0; i < 10; i++){ s = ss[i]; ...}

  如果定義在內(nèi)部,每次循環(huán)都要重新定義string變量s,意味著每次循環(huán)都要調(diào)用構(gòu)造和析構(gòu)函數(shù);而定義在外部每次循環(huán)只需要調(diào)用復(fù)制構(gòu)造函數(shù)。

  一般建議將大的對(duì)象定義到外部,提高運(yùn)行效率,把小的對(duì)象定義在里面,提高程序可讀性。

  基本運(yùn)算和函數(shù)

  1、在乘以2(或2的整數(shù)次冪)或除以2(或2的整數(shù)次冪)的時(shí)候盡量用位運(yùn)算來(lái)替代。

  2、盡量減少使用除法運(yùn)算(可以適當(dāng)轉(zhuǎn)換為乘法,如條件判斷時(shí)將if (a == b / c)替換為if (a * c == b)。除法運(yùn)算需要更多的移位和轉(zhuǎn)換操作,往往需要的時(shí)間是相應(yīng)乘法的兩倍)

  3、多使用+=、-=、*=、/=等復(fù)合運(yùn)算符,以加一為例,效率由高到低是(i++ 、 i += 1 、 i = i + 1)

  4、多掌握一些小巧的庫(kù)函數(shù),例如:swap, max, min, sort, qsort, ati, stoi...它們用起來(lái)方便,效率更是比一般人寫(xiě)的代碼高。

  inline、const、&修飾符

  inline讓函數(shù)內(nèi)聯(lián),建議編譯器將函數(shù)體代碼“復(fù)制粘貼”到函數(shù)調(diào)用處,在函數(shù)體短小,函數(shù)調(diào)用又比較頻繁的時(shí)候能有效避免因函數(shù)調(diào)用帶來(lái)的內(nèi)存開(kāi)銷(xiāo)(因?yàn)槊恳淮握{(diào)用函數(shù)系統(tǒng)都會(huì)生成許多額外的變量)。

  const不僅僅可以保證其修飾的變量不被修改,提高程序的穩(wěn)定性,同時(shí)也讓編譯器更好地為我們優(yōu)化代碼。

  舉個(gè)例子:我們?nèi)绻胏onst修飾某一個(gè)常量,那么程序中所有用到該常量的地方都會(huì)用其值來(lái)代替,這樣就避免了讀取其地址而浪費(fèi)時(shí)間。

  &修飾返回值類(lèi)型和參數(shù)類(lèi)型表示采取引用的方式傳遞,避免了對(duì)象賦值構(gòu)造所需的時(shí)間和內(nèi)存。

  緩存(cache)和寄存器(register)

  除了CPU,就是寄存器和緩存的訪問(wèn)速度最高了,一般不建議我們自己定義寄存器變量和控制數(shù)據(jù)緩存,編譯器會(huì)自動(dòng)幫我們把經(jīng)常用到的一些數(shù)據(jù)放到緩存和寄存器中。

  但是,了解一些編譯器控制數(shù)據(jù)的依據(jù)對(duì)編程也有極大幫助。一般來(lái)說(shuō),放到寄存器/緩存的數(shù)據(jù)優(yōu)先級(jí)為:用register修飾的變量,循環(huán)控制變量,auto局部變量,靜態(tài)變量,用戶(hù)自己分配的內(nèi)存數(shù)據(jù)。

  迭代器(iterator)

  1、訪問(wèn)容器中元素的時(shí)候盡量使用迭代器而不是下標(biāo)或者指針。在剛從C語(yǔ)言轉(zhuǎn)到C++的那段時(shí)間,我非常不適應(yīng)迭代器的用法,總覺(jué)得下標(biāo)訪問(wèn)多好,與for循環(huán)搭配在一起簡(jiǎn)直是無(wú)敵的存在。

  后來(lái)我才慢慢發(fā)掘出迭代器的眾多優(yōu)勢(shì)。

  首先,迭代器訪問(wèn)元素類(lèi)似與指針,相對(duì)于下標(biāo)訪問(wèn)不用根據(jù)下標(biāo)值計(jì)算地址,這在循環(huán)中能夠節(jié)省不少時(shí)間。

  其次,迭代器作為指針一種延拓,能更好的代表并操作其所指的對(duì)象,而在下標(biāo)訪問(wèn)中我們往往用一個(gè)int值pos來(lái)表示pos下標(biāo)下的元素,沒(méi)有面向?qū)ο缶幊痰闹庇^。再次,迭代器為我們?cè)L問(wèn)各種容器(數(shù)組,vector,list,map,queue,deque,set …)中的元素提供了統(tǒng)一的方法,其作用類(lèi)似于“語(yǔ)法糖”,讓編程更加簡(jiǎn)單、方便。

  2、另外在使用迭代器的自增和自減運(yùn)算符需要注意,iterator++,和++iterator的效率有天壤之別。兩種自增方式的運(yùn)算符重載如下:

  iterator & operator++(){ // 前增 ++*this; return (*this);}iterator operator++(int){ // 后增 iterator temp = *this; ++*this; return (temp);}

  后增(iterator++)相對(duì)于前增(++iterator)創(chuàng)建了一個(gè)臨時(shí)迭代器temp,并將其返回,而前增直接返回原來(lái)迭代器的引用。在for循環(huán)中的頻繁自增操作中,創(chuàng)建臨時(shí)迭代器temp,以及返回temp時(shí)調(diào)用的復(fù)制構(gòu)造函數(shù)所需的時(shí)間不容忽視。

  vector容器

  vector容器毫無(wú)疑問(wèn)是C++STL使用最為頻繁的容器了,當(dāng)然這個(gè)強(qiáng)大容器的使用也包含了很多的小技巧。

  1、在適當(dāng)時(shí)候使用emplace和emplace_back函數(shù)來(lái)替代insert和push_back函數(shù)。

  它們之間的區(qū)別很明顯,insert和push_back函數(shù)參數(shù)是vector容器里面的模板對(duì)象,而帶emplace的函數(shù)參數(shù)是模板對(duì)象的構(gòu)造函數(shù)的參數(shù),這意味著后者將模板對(duì)象插入到vector容器的過(guò)程中不用先生成好對(duì)象,而是可以直接利用參數(shù)構(gòu)造。

  當(dāng)然如果模板對(duì)象已經(jīng)是生成好的,那就沒(méi)有必要用emplace函數(shù)了。在很多循環(huán)遞歸迭代中,往往需要反復(fù)向vector容器中添加對(duì)象,這時(shí)候額外構(gòu)造一個(gè)對(duì)象所需要的時(shí)間和空間就不容忽視了,因此這是一個(gè)vector進(jìn)階用法的好trick。

  2、vector容器的底層實(shí)現(xiàn)是數(shù)組,并且在當(dāng)元素大于最大容量的時(shí)候會(huì)重新生成一個(gè)更大的數(shù)組,將原來(lái)數(shù)組中的對(duì)象復(fù)制構(gòu)造到新數(shù)組中。

  由于要重新分配大量?jī)?nèi)存以及反復(fù)調(diào)用復(fù)制構(gòu)造函數(shù),這對(duì)時(shí)間和空間的開(kāi)銷(xiāo)是巨大的。為了減少內(nèi)存的重新分配,我們可以適當(dāng)?shù)墓烙?jì)我們需要保存的元素?cái)?shù)量,并在vector初始化的時(shí)候指定其capacity。

  這種方法很直接但也有其缺點(diǎn),就是我們往往很難在開(kāi)始的時(shí)候就估計(jì)準(zhǔn)確我們要保存的元素?cái)?shù)量(如果能,我們就直接用數(shù)組得了)。

  一個(gè)很好的解決辦法是:將vector中保存的元素改為指針,指針指向我們真正想要保存的對(duì)象。由于指針相對(duì)于其所指向的對(duì)象來(lái)說(shuō)占用內(nèi)存很小,而且在復(fù)制的時(shí)候不用調(diào)用復(fù)制構(gòu)造函數(shù),因此以上提到的一些缺點(diǎn)都能很好的克服。

  事實(shí)上,對(duì)于能夠熟練控制內(nèi)存分配的老碼農(nóng)來(lái)說(shuō),這種vector + 指針的方式是十分完美的。

  if條件判斷

  在進(jìn)入討論之前,我們先思考下面這個(gè)例子:

  一個(gè)班的數(shù)學(xué)成績(jī)?nèi)缦拢?4、76、78、94、97、68、77、65、54、89…,總共有50個(gè)數(shù)據(jù)。

  要求用程序?qū)⒎謹(jǐn)?shù)為優(yōu)秀(>=80)、良好(>=70)、及格(>=60)、不及格(>=0)四個(gè)分?jǐn)?shù)段。

  for 所有學(xué)生分?jǐn)?shù) if 分?jǐn)?shù) < 60 歸為不及格段 else if 分?jǐn)?shù) < 70 歸為及格段 else if 分?jǐn)?shù) < 80 歸為良好段 else 歸為優(yōu)秀段

  這個(gè)偽代碼邏輯沒(méi)有問(wèn)題,但是就這個(gè)數(shù)據(jù)來(lái)看這段代碼運(yùn)行效率糟透了。

  由于這個(gè)班的數(shù)學(xué)成績(jī)絕大多數(shù)是良好和優(yōu)秀,而這個(gè)程序需要三次if判斷才能將分?jǐn)?shù)歸為良好,三次if判斷加上一個(gè)else才能將分?jǐn)?shù)歸為優(yōu)秀,所以絕大多數(shù)前兩個(gè)if判斷是不必要的。我們將if判斷語(yǔ)句的順序變換下:

  for 所有學(xué)生分?jǐn)?shù) if 分?jǐn)?shù) >= 80 歸為優(yōu)秀段 else if 分?jǐn)?shù) >= 70 歸為良好段 else if 分?jǐn)?shù) >= 60 歸為及格段 else 歸為不及格段

  在這個(gè)偽代碼中絕大多數(shù)分?jǐn)?shù)都在前兩個(gè)if語(yǔ)句中完成了分段。兩者的時(shí)間效率相差巨大,實(shí)際運(yùn)行也發(fā)現(xiàn),前者是后者運(yùn)行時(shí)間的兩倍多。

  switch分支判斷

  switch語(yǔ)句的底層實(shí)現(xiàn)主要有三種方式:轉(zhuǎn)換為if else 語(yǔ)句,跳轉(zhuǎn)表,樹(shù)形結(jié)構(gòu)。

  當(dāng)分支比較小時(shí),編譯器傾向于轉(zhuǎn)換為if else語(yǔ)句,當(dāng)分支比較多,分支范圍很廣時(shí),用樹(shù)形結(jié)構(gòu),當(dāng)分支數(shù)量不算多,分支范圍緊湊時(shí),用跳轉(zhuǎn)表。

  跳轉(zhuǎn)表的底層實(shí)現(xiàn)是數(shù)組映射,對(duì)條件轉(zhuǎn)換的效率為O(1),相比于另外兩種方式優(yōu)勢(shì)明顯,因此我們應(yīng)該盡量控制分支的數(shù)量,以及讓各個(gè)分支的int型數(shù)據(jù)緊湊。

  不知道這些技巧小伙伴們都了解了嗎?

  #你在編程過(guò)程中還有什么小技巧#

  1. 廣告1
  2. 廣告2
  3. 廣告3
  4. 廣告4
主站蜘蛛池模板: 尤物蜜芽福利国产污在线观看| 92手机看片福利永久国产| 国产成人精品视频一区二区不卡| 自拍在线视频| 免费一级美国片在线观看| 国产精品夫妇久久| 欧美日韩乱国产| 亚洲欧美国产精品久久久| 日本乱人伦片中文字幕三区| 国产精品免费aⅴ片在线观看| 久久久久国产精品美女毛片| 成人满18在线观看网站免费| 日韩欧美一二区| 成人看片在线观看免费| 欧美一级毛片大片免费播放| 国产精品日韩欧美在线第3页| 亚洲欧美高清在线| 国产人做人爱视频精品| 欧美亚洲国产精品久久久久| 国产成人精视频在线观看免费| 日韩三级免费观看| 在线免费成人| 九九在线视频| 亚洲欧美二区三区久本道| 精品国产免费观看一区| 欧美精品xxxⅹ欧美| 不卡一级毛片免费高清| 欧美xxx在线| 欧美最黄视频| 成 人 在 线 免费 8888 www| 欧美人成在线观看| 失禁h啪肉尿出来高h男男| 国产成人免费高清视频网址| 欧美日韩一区二区视频图片| 武松金莲肉体交战在线观看| 国产99久久久久久免费看| 欧美成人免费夜夜黄啪啪| 日韩高清一级| 2022免费国产精品福利在线| 国产色视频在线观看免费| 久热国产在线视频|