特定容器算法
與其他容器不同,鏈表類型list與forward_list定義了幾個成員函數形式的算法,如下表所示。特別是,它們定義了獨有的sort、merge、remove、reverse和unique。通用版本的sort要求隨機訪問迭代器,因此不能用于list和forward_list,因為這兩個類型分別提供雙向迭代器和前向迭代器。
鏈表類型定義的其他算法的通用版本可以用于鏈表,但代價太高。這些算法需要交換輸入序列中的元素。一個鏈表可以通過改變元素間的鏈接而不是真正的交換它們的值來傳遞“交換”元素。因此,這些鏈表版本的算法的性能比對應的通用版本好很多。
注意:對于list和forward_list應該優先使用成員函數版本的算法而不是通用算法。
| list和forward_list成員函數版本的算法 |
| 這些操作都返回void lst.merge(lst2) ? 將來自lst2的元素合并入lst。lst和lst2都必須是有序的。 lst.merge(lst2,comp) ? 元素將從lst2中刪除。在合并之后,lst2變為空。第一個版本使用<運算符;第二個版本使用給定的比較操作 ? lst.remove(val)? 調用erase刪除掉與給定值相等(==)或令一元謂詞為真的每個元素 lst.remove_if(pred) lst.reverse() 反轉lst中元素的順序 lst.sort() 使用<或給定比較操作排序元素 lst.sort(comp) lst.unique() ? 調用erase刪除同一值的連續拷貝。第一個版本使用==;第二個版本使用給定的二元謂詞 lst.unique(pred) |
splice成員
鏈表類型還定義了splice算法。其描述見下表。此算法是鏈表數據結構所特有的,因此不需要通用版本。
| list和forward_list的splice成員函數的參數 |
| lst.splice(args)或flst.splice_after(args) (p,lst2) p是一個指向lst中元素的迭代器,或一個指向flst首前位置的迭代器。函數將lst2的所有元素移動到lst中p之前的位置或是flst中p之后的位置。將元素 從lst2中刪除。lst2的類型必須與lst或flst相同,且不能是同一個鏈表 (p,lst2,p2) ?p2是一個指向lst2中位置的有效的迭代器。將p2指向的元素移動到lst中,或將p2之后的元素移動到flst中。lst2可以是與lst或flst相同的鏈表 (p,lst2,b,e) b和e必須表示lst2中的合法范圍。將給定范圍中的元素從lst2移動到lst或flst。lst2與lst(或flst)可以是相同的鏈表,但p不能指向給定范圍中元素 |
?
鏈表特有的操作會改變容器
多數鏈表特有的算法都與其通用版本很相似,但不完全相同。鏈表特有版本與通用版本間的一個至關重要的區別是鏈表版本會改變底層的容器。例如,remove的鏈表版本會刪除指定的元素。unique的鏈表版本會刪除第二個和后繼的重復元素。
類似的,merge和splice會銷毀其參數。例如,通用版本的remove將合并的序列寫給一個給定的目的迭代器:兩個輸入序列是不變的。而鏈表版本的merge函數會銷毀給定的鏈表——元素從參數指定的鏈表中刪除,被合并到調用merge的鏈表對象中。在merge之后,來自兩個鏈表中的元素仍然存在,但它們都已在同一個鏈表中。
?
轉載于:https://www.cnblogs.com/wuchanming/p/3918418.html
總結
- 上一篇: 用程序算法做人生选择
- 下一篇: android adt 最新下载地址