- 1、本文档共62页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
泛型演算法.ppt
泛型演算法 outline 11.1概觀 11.2演算法初窺 11.3重訪iterators 11.4泛型演算法的結構 11.5容器特有的演算法 前言 為什麼需要泛型演算法? 標準容器(standard containers)定義的操作很少 添加元素 移除元素 存取第一個和最後一個元素 取得和重置容器大小 取得iterator指向「第一個元素」和指向「最後一個元素下一個位置」 前言 演算法:執行常見操作 泛型:可在多個容器型別上操作 功能: 對循序式容器(sequential container)排序 尋找一個元素 找最大值或最小值 可用於vector、list、array,也可用於自己定義的容器型別 11.1概觀 假設有一個vector of ints名為vec,想知道他是否放置某個特定值,最簡單的解法是使用程式庫提供的find(): 11.1概觀 11.1概觀 由於find只根據iterators進行,所以我們可以在任何容器身上使用find()尋找元素值。例如從list中找尋某值: 11.1概觀 Array的pointer的行為和iterators相似,我們可以在array身上使用find(): 只搜尋ia[1]和ia[2]元素 int *result = find(ia + 1, ia + 3, search_value); Find必須執行的步驟: 依次檢查每個元素 如果元素等於我們想尋找的值,返回一個iterator指向這個元素。 否則檢查下一個元素;重複第二步,直到找到這個值,或檢查完畢所有元素 如果到達元素集末端而還沒有找到這個值,返回一個特殊值表示沒有找到該元素 標準演算法的必要條件: 1. 需要某種集合巡訪的方式:能夠從一個元素向前移到下一個元素。 泛型演算法滿足的辦法是使用iterators: iterators支援 increment(累加)運算子:從某個元素前進到下一個元素 dereference(提領)運算子:取得元素值 equality(相等)、inequality(不相等)運算子:判斷兩個iterators是否相等 標準演算法的必要條件: 2. 必須能夠知道是否到達了集合的末端。 大多數演算法至少帶有2個iterators,用來標示演算法的作用區間。 第一個iterator指向區間的第一個元素 第二個iterator(有時被稱為off-the-end iterator)指向區間最後一個元素的下一個位置 標準演算法的必要條件: 3. 必須能夠對容器中的每一個元素與被查找的元素進行比較。 4. 需要一個型別指出元素在容器中的位置,或者用來表示找不到該元素。 off-the-end iterator提供一個方便的返回值表示搜尋沒有成功,如果沒有找到給定植就返回off-the-end iterator,否則就返回一個iterator指向匹配元素。 重要概念:泛型演算法從不呼叫容器的操作函式 泛型演算法不執行容器操作,他們只根據iterators和其相關操作來運作。使用一般的iterators時,演算法絕不會改變底層容器的大小,在稍後的章節將看到,演算法可能改變容器元素的值,可能在容器中移動元素,但都沒有直接添加或移除元素。 11.2.1唯獨(read-only)演算法 簡易的例子:find()、accumulate() accumulate()定義於表頭檔numeric(此標準庫定義若干數值演算法)。 // sum the elements in vec starting the summation with the value 42 int sum = accumulate(vec.begin(), vec.end(), 42); 令sum等於vec內所有元素加總再加42。 用來指定初值的第三個參數很有必要,因為accumulate()對於即將計算的元素型別一無所知。 // concatenate elements from v and store in sum string sum = accumulate(v.begin(), v.end(), string ()); 把vec中每個元素串接至原本為空的一個string身上 使用find_first_of() 這個演算法帶有2對iterators,用來表示兩個區間。 搜尋第一個區間中「與第2個區間內的任何元素匹配」的元素,返回一個iterator指向第一個吻合元素。如果沒有任何吻合,就返回第一個區間的end iterator。 例子:假設roster1和roster2是兩個存放姓名的lists,用find_first_of()來找出多少個同名同姓存在兩個list當中 注意:roster1和roster2的型別可以不用相同,但兩序
文档评论(0)