C 在程式中高效實用STL

2021-07-15 05:01:03 字數 2313 閱讀 8745

使用演算法的有如下理由:

在效率上來說,

例如,在以下**中,手寫迴圈在每一次迴圈中都要計算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,...