青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

STL算法學習

STL算法學習,小結如下:

前提:

下載stl源碼: ?http://www.sgi.com/tech/stl/download.html
打開網頁:???? http://www.sgi.com/tech/stl/stl_index.html

一?? 函數對象: 因為很多的算法中多使用了函數對象


二元函數對象,V1和V2為輸入,V3為結果

plus<T>:
? transform(V1.begin(), V1.end(), V2.begin(), V3.begin(),plus<double>());

其他的二元函數對象:minus,multiples,divieds,modulus.

二元斷言函數對象,使用時需要bind2nd()或bind1st()來綁定比較對象。

less<T>:
? find_if(L.begin(), L.end(), bind2nd(less<int>(), 0));

其他的二元斷言函數:equal_to,notequal_to,greater,greater_equal,less_equal,logical_and,logical_or

二元邏輯函數

binary_negate:
const char* wptr = find_if(str, str + MAXLEN,
?????????????????????????? compose2(not2(logical_or<bool>()),
??????????????????????????????????? bind2nd(equal_to<char>(), ' '),
??????????????????????????????????? bind2nd(equal_to<char>(), '\n')));

一元函數對象

negate:
transform(V1.begin(), V1.end(), V2.begin(),
????????? negate<int>());

一元斷定函數對象

logical_not:
? transform(V.begin(), V.end(), V.begin(), logical_not<bool>());

一元邏輯函數

unary_negate:


二?? 函數對象發生器:主要用來填充序列。


產生不重復的隨機數:
// Generate unique random numbers from 0 to mod:
class URandGen {
? std::set<int> used;
? int limit;
public:
? URandGen(int lim) : limit(lim) {
??? srand(time(0));
? }
? int operator()() {
??? while(true) {
????? int i = int(rand()) % limit;
????? if(used.find(i) == used.end()) {
??????? used.insert(i);
??????? return i;
????? }
??? }
? }
};

const int sz = 10;
const int max = 50;
vector<int> x(sz), y(sz), r(sz);
//An integer random number generator:
URandGen urg(max);
generate_n(x.begin(), sz, urg);

三 函數對象適配器 : 將函數轉化為函數對象

ptr_fun:一般函數適配器

一元實例:
transform(first, last, first,
????????? compose1(negate<double>, ptr_fun(fabs)));

二元實例:
list<char*>::iterator item =
????????????? find_if(L.begin(), L.end(),
????????????????????? not1(binder2nd(ptr_fun(strcmp), "OK")));

not1:對一元的斷定函數對象取反的適配器。

not2: 對二元的斷定函數對象取反的適配器。

mem_fun與mem_fun_ref:類成員函數的適配器,區別是一個需要指針,而另一個僅需要一般對象。如下:
shape是一個指針變量,則foreach(v.begin(),v.end(),mem_fun(&shape::draw));
但如果shape是一般的變量,不是指針,則foreach(v.begin(),v.end(),mem_fun_ref(&shape::draw));

四?? 算法:

拷貝:
copy()
reverse_copy()
rotate_copy()
remove_copy()? 拷貝不等于某值的元素到另一個序列。
remove_copy_if() 拷貝符合條件的到另一個序列。

填充和生成:
fill()
fill_n() 填充序列中的n個元素。
generate()為序列中的每個元素調用gen()函數。

排列:
next_permuttion() 后一個排列。
prev_permutation()

partition() 劃分,將滿足條件的元素移動到序列的前面。
stable_partition()

查找和替換:
find()
binary_search() 在一個已經有順序的序列上查找。
find_if()
search() 檢查第二個序列是否在第一個序列中出現,且順序相同。

刪除:注意必須調用erase()來真正刪除
remove()
unique()刪除相鄰重復元素,最好現排序。

合并序列:
merge()

數值算法:
accumulate() 對序列的每個元素進行運算后求和。
transform() 也可以對每個元素進行運算。
計數:
size()總個數。
count()等于某值的元素個數。

adjacent_difference 序列中的后一個減前與他相鄰的前一個得到新的序列。

adiacent_find

五?? 所有的算法:

???? accumlate iterator 對標志的序列中的元素之和,加到一個由 init 指定的初始值上。重載的版本不再做加法,而是傳進來的二元操作符被應用到元素上。
adjacent_different
:創建一個新序列,該序列的每個新值都代表了當前元素與上一個元素的差。重載版本用指定的二元操作計算相鄰元素的差。
adjacent_find
:在 iterator 對標志的元素范圍內,查找一對相鄰的重復元素,如果找到返回一個 ForwardIterator ,指向這對元素的第一個元素。否則返回 last 。重載版本使用輸入的二元操作符代替相等的判斷。
binary_search
:在有序序列中查找 value ,如果找到返回 true 。重載的版本使用指定的比較函數對象或者函數指針來判斷相等。
copy
:復制序列。
copy_backward
:除了元素以相反的順序被拷貝外,別的和 copy 相同。
count
:利用等于操作符,把標志范圍類的元素與輸入的值進行比較,并返回相等元素的個數。
count_if
:對于標志范圍類的元素,應用輸入的操作符,并返回結果為 true 的次數。
equal
:如果兩個序列在范圍內的元素都相等,則 equal 返回 true 。重載版本使用輸入的操作符代替了默認的等于操作符。
equal_range
:返回一對 iterator ,第一個 iterator 表示由 lower_bound 返回的 iterator ,第二個表示由 upper_bound 返回的 iterator 值。
fill
:將輸入的值的拷貝賦給范圍內的每個元素。
fill_n
:將輸入的值賦值給 first frist+n 范圍內的元素。
find
:利用底層元素的等于操作符,對范圍內的元素與輸入的值進行比較。當匹配時,結束搜索,返回該元素的一個 InputIterator 。
find_if
:使用輸入的函數替代了等于操作符執行了 find
find_end
:在范圍內查找“由輸入的另外一個 iterator 對標志的第二個序列”的最后一次出現。重載版本中使用了用戶輸入的操作符替代等于操作。
find_first_of
:在范圍內查找“由輸入的另外一個 iterator 對標志的第二個序列”中的任意一個元素的第一次出現。重載版本中使用了用戶自定義的操作符。
for_each
:依次對范圍內的所有元素執行輸入的函數。
generate
:通過對輸入的函數 gen 的連續調用來填充指定的范圍。
generate_n
:填充 n 個元素。
includes
:判斷 [first1, last1) 的一個元素是否被包含在另外一個序列中。使用底層元素的 <= 操作符,重載版本使用用戶輸入的函數。
inner_product
:對兩個序列做內積 ( 對應的元素相乘,再求和 ) ,并將內積加到一個輸入的的初始值上。重載版本使用了用戶定義的操作。
inner_merge
:合并兩個排過序的連續序列,結果序列覆蓋了兩端范圍,重載版本使用輸入的操作進行排序。
iter_swap
:交換兩個 ForwardIterator 的值。
lexicographical_compare
:比較兩個序列。重載版本使用了用戶自定義的比較操作。
lower_bound
:返回一個 iterator ,它指向在范圍內的有序序列中可以插入指定值而不破壞容器順序的第一個位置。重載函數使用了自定義的比較操作。
max
:返回兩個元素中的較大的一個,重載版本使用了自定義的比較操作。
max_element
:返回一個 iterator ,指出序列中最大的元素。重載版本使用自定義的比較操作。
min
:兩個元素中的較小者。重載版本使用自定義的比較操作。
min_element
:類似與 max_element ,不過返回最小的元素。
merge
:合并兩個有序序列,并存放到另外一個序列中。重載版本使用自定義的比較。
mismatch
:并行的比較兩個序列,指出第一個不匹配的位置,它返回一對 iterator ,標志第一個不匹配的元素位置。如果都匹配,返回每個容器的 last 。重載版本使用自定義的比較操作。
next_permutation
:取出當前范圍內的排列,并將其重新排序為下一個排列。重載版本使用自定義的比較操作。
nth_element
:將范圍內的序列重新排序,使所有小于第 n 個元素的元素都出現在它前面,而大于它的都出現在后面,重載版本使用了自定義的比較操作。
partial_sort
:對整個序列做部分排序,被排序元素的個數正好可以被放到范圍內。重載版本使用自定義的比較操作。
partial_sort_copy
:與 partial_sort 相同,除了將經過排序的序列復制到另外一個容器。
partial_sum
:創建一個新的元素序列,其中每個元素的值代表了范圍內該位置之前所有元素之和。重載版本使用了自定義操作替代加法。
partition
:對范圍內元素重新排序,使用輸入的函數,把計算結果為 true 的元素都放在結果為 false 的元素之前。
prev_permutation
:取出范圍內的序列并將它重新排序為上一個序列。如果不存在上一個序列則返回 false 。重載版本使用自定義的比較操作。
random_shuffle
:對范圍內的元素隨機調整次序。重載版本輸入一個隨機數產生操作。
remove
:刪除在范圍內的所有等于指定的元素,注意,該函數并不真正刪除元素。內置數組不適合使用 remove remove_if 函數。
remove_copy
:將所有不匹配的元素都復制到一個指定容器,返回的 OutputIterator 指向被拷貝的末元素的下一個位置。
remove_if
:刪除所有范圍內輸入操作結果為 true 的元素。
remove_copy_if
:將所有不匹配的元素拷貝到一個指定容器。
replace
:將范圍內的所有等于 old_value 的元素都用 new_value 替代。
replace_copy
:與 replace 類似,不過將結果寫入另外一個容器。
replace_if
:將范圍內的所有操作結果為 true 的元素用新值替代。
replace_copy_if
:類似與 replace_if ,不過將結果寫入另外一個容器。
reverse
:將范圍內元素重新按反序排列。
reverse_copy
:類似與 reverse ,不過將結果寫入另外一個容器。
rotate
:將范圍內的元素移到容器末尾,由 middle 指向的元素成為容器第一個元素。
rotate_copy
:類似與 rotate ,不過將結果寫入另外一個容器。
search
:給出了兩個范圍,返回一個 iterator ,指向在范圍內第一次出現子序列的位置。重載版本使用自定義的比較操作。
search_n
:在范圍內查找 value 出現 n 次的子序列。重載版本使用自定義的比較操作。
set_difference
:構造一個排過序的序列,其中的元素出現在第一個序列中,但是不包含在第二個序列中。重載版本使用自定義的比較操作。
set_intersection
:構造一個排過序的序列,其中的元素在兩個序列中都存在。重載版本使用自定義的比較操作。
set_symmetric_difference
:構造一個排過序的序列,其中的元素在第一個序列中出現,但是不出現在第二個序列中。重載版本使用自定義的比較操作。
set_union
:構造一個排過序的序列,它包含兩個序列中的所有的不重復元素。重載版本使用自定義的比較操作。
sort
:以升序重新排列范圍內的元素,重載版本使用了自定義的比較操作。
stable_partition
:與 partition 類似,不過它不保證保留容器中的相對順序。
stable_sort
:類似與 sort ,不過保留相等元素之間的順序關系。
swap
:交換存儲在兩個對象中的值。
swap_range
:將在范圍內的元素與另外一個序列的元素值進行交換。
transform
:將輸入的操作作用在范圍內的每個元素上,并產生一個新的序列。重載版本將操作作用在一對元素上,另外一個元素來自輸入的另外一個序列。結果輸出到指定的容器。
unique
:清除序列中重復的元素,和 remove 類似,它也不能真正的刪除元素。重載版本使用了自定義的操作。
unique_copy
:類似與 unique ,不過它把結果輸出到另外一個容器。
upper_bound
:返回一個 iterator ,它指向在范圍內的有序序列中插入 value 而不破壞容器順序的最后一個位置,該位置標志了一個大于 value 的值。重載版本使用了輸入的比較操作。
堆算法: C++ 標準庫提供的是 max-heap 。一共由以下 4 個泛型堆算法。
make_heap
:把范圍內的元素生成一個堆。重載版本使用自定義的比較操作。
pop_heap
:并不是真正的把最大元素從堆中彈出,而是重新排序堆。它把 first last-1 交換,然后重新做成一個堆??梢允褂萌萜鞯?/span> back 來訪問被“彈出“的元素或者使用 pop_back 來真正的刪除。重載版本使用自定義的比較操作。
push_heap
:假設 first last-1 是一個有效的堆,要被加入堆的元素在位置 last-1 ,重新生成堆。在指向該函數前,必須先把元素插入容器后。重載版本使用指定的比較。
sort_heap
:對范圍內的序列重新排序,它假設該序列是個有序的堆。重載版本使用自定義的比較操作。

接下來: STL容器學習

posted on 2007-03-14 16:04 夢在天涯 閱讀(11798) 評論(2)  編輯 收藏 引用 所屬分類: CPlusPlus

評論

# re: STL算法學習 2007-03-15 09:19 Galaxy_Yang

不錯, 還不熟悉STL的函數對象啊,
看來, 在以后的工作中要多熟悉sTL的算法了

很好, 支持這樣的總結!  回復  更多評論   

# re: STL算法學習[未登錄] 2008-12-19 21:02 熊哥

very good!  回復  更多評論   

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811980
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              久久综合国产精品台湾中文娱乐网| 99精品视频一区| 欧美一区二区免费视频| 国产欧美二区| 久久影音先锋| 欧美成人一区二区| 亚洲一区在线播放| 性做久久久久久久免费看| 国产综合自拍| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩八区| 欧美一区二区三区久久精品茉莉花| 欧美一进一出视频| 在线色欧美三级视频| 亚洲美女诱惑| 国产午夜精品麻豆| 欧美激情女人20p| 国产精品免费看片| 嫩草影视亚洲| 国产精品亚洲а∨天堂免在线| 久久精品国产亚洲一区二区三区| 美女主播视频一区| 亚洲欧美日韩成人高清在线一区| 久久成人精品无人区| 日韩视频在线一区二区三区| 亚洲图色在线| 久久久精品视频成人| 亚洲午夜免费视频| 久久久www成人免费无遮挡大片| 亚洲另类自拍| 久久激情综合| 亚洲欧美日韩精品一区二区| 久久天天躁夜夜躁狠狠躁2022| 亚洲午夜一级| 免费观看在线综合色| 欧美中文在线免费| 欧美日韩另类丝袜其他| 久热精品视频在线| 国产精品美女主播在线观看纯欲| 欧美国产视频在线| 国内精品久久久久影院 日本资源| 最新亚洲电影| 亚洲国产国产亚洲一二三| 亚洲伊人网站| 一区二区三区视频在线| 蜜臀久久久99精品久久久久久| 欧美在线播放视频| 国产精品久久久久婷婷| 亚洲高清一二三区| 亚洲国产精品免费| 久久人人超碰| 麻豆精品视频在线观看视频| 国产欧美一区二区三区视频| 亚洲一区二区免费看| 一区二区三区精品视频在线观看| 玖玖在线精品| 欧美插天视频在线播放| 精品电影在线观看| 久久精品人人| 美女视频黄a大片欧美| 黄色一区二区三区四区| 欧美影院视频| 久久久久久香蕉网| 国产一区二区无遮挡| 久久国产精品99精品国产| 久久国内精品视频| 韩国一区二区三区美女美女秀| 亚洲欧美日产图| 欧美一区二区三区免费观看视频| 国产精品毛片一区二区三区| 中日韩高清电影网| 先锋资源久久| 国产性猛交xxxx免费看久久| 欧美专区在线播放| 欧美国产日本高清在线| 亚洲精品视频在线看| 欧美久久久久免费| 亚洲视频在线观看免费| 欧美一区亚洲二区| 极品少妇一区二区三区| 欧美成年人网| 亚洲精品看片| 久久国产加勒比精品无码| 在线成人小视频| 欧美激情精品久久久久久久变态| 夜夜嗨av一区二区三区| 欧美专区日韩专区| 依依成人综合视频| 欧美日韩免费观看一区=区三区| 中文日韩在线| 裸体丰满少妇做受久久99精品| 亚洲激情偷拍| 国产噜噜噜噜噜久久久久久久久| 久久久久99精品国产片| 亚洲啪啪91| 雨宫琴音一区二区在线| 欧美日韩精品一区二区在线播放| 亚洲男人的天堂在线| 老司机午夜免费精品视频| 99精品视频一区| 国产欧亚日韩视频| 欧美精品色综合| 性欧美在线看片a免费观看| 亚洲电影视频在线| 久久精品99无色码中文字幕| 亚洲精品久久久久久久久久久| 国产精品日日做人人爱| 欧美激情性爽国产精品17p| 午夜一级久久| 在线亚洲一区二区| 欧美激情按摩| 久久青草久久| 亚洲欧美另类国产| 亚洲免费观看| 在线精品在线| 国产一区二区三区精品久久久| 欧美日韩另类视频| 欧美暴力喷水在线| 久久午夜色播影院免费高清| 亚洲自拍高清| 日韩午夜高潮| 亚洲欧洲在线播放| 欧美大片免费观看| 麻豆成人精品| 性做久久久久久| 亚洲素人一区二区| 日韩视频在线观看免费| 亚洲第一视频| 在线精品视频免费观看| 黑人一区二区| 国产一区二区三区在线观看免费| 国产精品免费观看在线| 欧美日韩在线视频一区| 欧美黄色大片网站| 欧美高清视频一二三区| 毛片av中文字幕一区二区| 久久精品亚洲精品国产欧美kt∨| 欧美亚洲在线播放| 小辣椒精品导航| 欧美一区二区三区播放老司机| 亚洲图片在区色| 亚洲综合三区| 欧美一区二区高清| 久久久久久网| 麻豆久久婷婷| 欧美另类久久久品| 欧美日韩国产精品专区 | 久久精品国语| 久久久久综合一区二区三区| 久久精品视频在线观看| 久久久夜夜夜| 欧美国产视频一区二区| 亚洲精品国产精品国自产在线| 亚洲激情国产精品| 一区二区三区日韩精品| 午夜精品久久久久| 久久久福利视频| 欧美aⅴ一区二区三区视频| 欧美精品粉嫩高潮一区二区| 欧美日韩一区二区在线| 国产免费成人| 亚洲国产精品www| 亚洲图片欧美午夜| 欧美在线影院| 亚洲成色777777女色窝| 一本色道久久综合亚洲精品按摩 | 在线观看视频一区二区| 亚洲品质自拍| 开心色5月久久精品| 久久米奇亚洲| 亚洲精品欧美激情| 亚洲欧美日本国产有色| 久久久伊人欧美| 欧美久久在线| 狠狠干综合网| 一区二区高清视频| 久久精品视频亚洲| 亚洲激情啪啪| 欧美一区二区视频97| 欧美久久影院| **网站欧美大片在线观看| 中文欧美在线视频| 麻豆国产精品一区二区三区| 一本久道久久综合狠狠爱| 久久精品一区| 国产精品久久久久一区二区三区| 激情欧美一区二区三区在线观看| 99精品国产一区二区青青牛奶| 欧美在线视频导航| 日韩视频在线播放| 久久先锋影音| 国产一区av在线| 亚洲一区三区电影在线观看| 欧美激情久久久久久| 欧美在线国产精品| 国产精品区一区二区三区| 日韩一级网站| 欧美黑人在线播放| 久久精品一区二区三区中文字幕| 国产精品久久久久9999高清|