使用演算法的有如下理由:
在效率上來說,
例如,在以下**中,手寫迴圈在每一次迴圈中都要計算vec.end(), 但在演算法呼叫中只計算了一次vec.end()。因為在迴圈進行過程中,vec.end()並沒有發生改變。
for (vector
::iterator iter = vec.begin();iter != vec.end();iter++)
for_each(vec.begin(), vec.end(), print);
因為stl的實現者很清楚,begin(), end(), size()這樣的函式會經常被呼叫,所以為了提高他們的效率一般都會被定義為inline的,其次,為了避免在迴圈中反覆計算他們的值,一般都會在迴圈外呼叫這個函式。
再就是,stl的實現者很清楚容器中所使用的資料結構,所以很清楚如何對它進行高效操作,而這一般是使用很難做到的。
在正確性來上說,
手寫迴圈最重要的是保證你所使用的迭代器都是有效的,並且指向你所希望的地方。
就比如說乙個在deque前部插入元素的方法:
deque
::iterator iter = deq.begin();
for (size_t i = 0; i < num; i++)
這個**容易想到嗎?為了正確地保護iter的有效性已經準確的位置。
如果使用演算法,則簡單了許多。
transform(data, data + num, insert(deq, deq.begin()), bind2nd(plus
(), 0);
但與此同時,我們可能會發現在很多情況下我們處理很複雜的操作,那麼更好的方法是使用c++11中提供的匿名函式,可以更自由地完成相應的操作。
int x = 2, y = 3;
vector
::iterator iter = find_if(v_i.begin(), v_i.end(), [&](int* i) -> bool);
**的清晰程度仍然比手寫**更好!
首先,使用成員函式往往更快,成員函式通常與容器(特別是關聯容器)結合得更好。成員函式都是準備於特定容器的特定資料結構而設計的,所以他們的實現更加高效。例如對於標準的關聯容器,使用成員函式,可以獲得對數時間的效率,可以使用等價性來判斷兩個值是否相同,可以在map和multimap中值關注鍵的部分。
我們先來區分一下count, find, binary_search, lower_bound, upper_bound, equal_range.
需要注意的是,count和find都是使用相等性測試,而binary_search, lower_bound, upper_bound, equal_range都使用等價性測試!
這意味著在使用lower_bound時必須確保手工編的等價性測試**和演算法中使用的比較函式是相同的。
#include
#include
using
namespace
std;
int main() ;
sort(v_i.begin(), v_i.end(), (int i, int j) -> bool );
copy(v_i.begin(), v_i.end(), ostream_iterator (cout, " "));
cout
<< endl;
vector
::iterator iter = lower_bound(v_i.begin(), v_i.end(), 3, (int i, int j = 3) -> bool );
if (iter != v_i.end() && *iter == 3)
return
0;}
使用equal_range也可以知道有多少個與之相等的值。通過區間的distance可以判讀個數。
簡單的總結就是:
需要注意的是:對於set和map而言,find並不是第乙個滿足條件的物件位置,而是其中的任意乙個物件。
書上說了這麼一句話,但我想說,使用函式物件還不如使用匿名函式來的方便。在c++11後,匿名函式幾乎可以在所有需要predicate函式上使用,而且更加方便自由。甚至可以解決直寫型**的弊端,把比較的方法直接寫在函式呼叫上。但問題就是,無法重複使用。畢竟匿名函式不可以封裝起來。
c 中高效的excel匯入sqlserver的方法
將oledb讀取的excel資料快速插入的sqlserver中,很多人通過迴圈來拼接sql,這樣做不但容易出錯而且效率低下,最好的辦法是使用 bcp,也就是system.data.sqlclient.sqlbulkcopy 類來實現。不但速度快,而且 簡單,下面測試 匯入乙個6萬多條資料的sheet...
c 中高效的excel匯入sqlserver的方法
將oledb讀取的excel資料快速插入的sqlserver中,很多人通過迴圈來拼接sql,這樣做不但容易出錯而且效率低下,最好的辦法是使用bcp,也就是system.data.sqlclient.sqlbulkcopy 類來實現。不但速度快,而且 簡單,下面測試 匯入乙個6萬多條資料的sheet,...
c 中高效的excel匯入sqlserver的方法
將oledb讀取的excel資料快速插入的sqlserver中,很多人通過迴圈來拼接sql,這樣做不但容易出錯而且效率低下,最好的辦法是使用bcp,也就是system.data.sqlclient.sqlbulkcopy 類來實現。不但速度快,而且 簡單,下面測試 匯入乙個6萬多條資料的sheet,...