日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环

發(fā)布時間:2025/7/14 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

每一個算法接受至少一對用來指示將被操作對象區(qū)間的迭代器,比如,min_element 可以找出此區(qū)間中的最小的值,而 accumulate 則對區(qū)間內(nèi)的元素作某種形式的整體求和運算,partition 將區(qū)間內(nèi)的元素分割為滿足和不滿足某某判決條件的兩個部分。算法執(zhí)行時,他們進行檢查指示給它的區(qū)間中的每一個元素,并且按照所期望的方式進行: 從區(qū)間中的起點循環(huán)到結(jié)束點。有一些算法,比如 find 和 find_if,可能在遍歷完成前就返回了,但是即使是這些算法,內(nèi)部都包含一個循環(huán)。

?

算法內(nèi)部是一個循環(huán),STL 的廣泛涉及面意味著,很多要用循環(huán)實現(xiàn)的任務(wù),可以改用算法實現(xiàn)。

1   class Widget 2   { 3   public: 4     void redraw() const; 5     . . . 6   }

使用循環(huán)

1   list<Widget> lw; 2   . . . 3   for(list<Widget>::iterator i = lw.begin(); i != lw.end(); i++) 4     i->redraw();

使用 for_each 算法

1   for_each( lw.begin(), lw.end(), mem_fun_ref(&Widget::redraw) );

有三個理由:

  效率: 算法通常比程序員產(chǎn)生的循環(huán)更高效

  正確性: 寫循環(huán)時比調(diào)用算法更容易產(chǎn)生錯誤

  可維護性: 算法通常使代碼比相應(yīng)的顯示循環(huán)更干凈、更直觀

?

?

效率:算法往往比循環(huán)減少了大量的函數(shù)調(diào)用次數(shù)(上例中,多次調(diào)用 lw.begin()),STL實現(xiàn)者知道 begin 和 end 用的很頻繁,多以盡可能把他們實現(xiàn)得最高效,幾乎肯定的是 inline 它們。實現(xiàn)者可以利用知道的容器具體實現(xiàn)優(yōu)勢,用庫的使用者無法采用方式來優(yōu)化遍歷。所有STL算法使用的計算機科學都比一般的 C++ 程序員能拿的出的算法更復雜。幾乎不可能被打敗的 sort 及同組算法(比如,stable_sort(), nth_element()等);適用于有序區(qū)間的搜索算法(比如,binary_search, lower-bound等);就算很平凡的任務(wù),比如從連續(xù)內(nèi)存容器中除去一些對象,使用 erase-remove 慣用法都比絕大多數(shù)程序員寫得更高效.

?

正確性:寫循環(huán)時,比麻煩的事在于確保所有使用的迭代器(a)有效,并且(b)指向所期望的地方,假設(shè)有一個數(shù)組,想獲得每一個元素,把它加上41,然后將結(jié)果插入一個 deque 的前端

1   size_t fillArray( double* pArray, size_t arraySize );//函數(shù)向數(shù)組寫入數(shù)據(jù),返回寫入double個數(shù) 2   double data[maxNumDoubles];   3   deque<double> d; 4   . . . 5   size_t numDoubles = fillArray( data, maxNumDoubles ); 6   for(size_t i = 0; i < numDoubles; i++) 7     d.insert( d.begin(), data[i] + 41 );  // 每個數(shù)據(jù)在 d 的前端插入 data[i] + 41         8                         // 這段代碼有一個bug!

這可以執(zhí)行,但是插入元素與在 data 中對應(yīng)的元素是反序的

不想反序可能想這樣修改:

1   deque<double>::iterator insertlocation = d.begin(); // 記下d的起始迭代器 2   for( size_t; i < numDoubles; i++ ) 3     d.insert( insertLocation++, data[i] + 41 );// 插入data[i]+41,然后insertLocation遞增 4                             // 這段代碼也有 bug

這樣使得每次調(diào)用 deque::insert 后,都導致所有指向 deque 內(nèi)部的迭代器失效

改為:

1 deque<double>::iterator insertlocation = d.begin(); 2 for( size_t i = 0; i < numDoubles; i++ ) 3 { 4 insertLocation = d.insert( insertLocation, data[i] + 41 ); 5      ++insertLocation; 6 }

?

調(diào)用算法 transform:

1   transform(data, data+numDoubles, inserter(d, d.begin()), bind2nd(plus<double>(), 41));

把迭代器扔給算法,讓他們考慮操縱迭代器時的各種詭異

?

?

?

?

?

?

?

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/kidycharon/p/10052365.html

總結(jié)

以上是生活随笔為你收集整理的Effective_STL 学习笔记(四十三) 尽量用算法调用代替手写循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。