STL進階--成員函式 vs 演算法
阿新 • • 發佈:2019-01-01
容器的成員函式 vs 演算法
容器中同名的函式
- List:
void remove(const T); template<class Comp> void remove_if(Comp); void unique(); template<class Comp> void unique(Comp); void sort(); template<class Comp> void sort(Comp); void merge(list&); template<class Comp> void merge(Comp); void reverse();
- 關聯容器:
size_type count(const T&) const;
iterator find(const T&) const;
iterator lower_bound(const T&) const;
iterator upper_bound(const T&) const;
pair<iterator,iterator> equal_range (const T&) const;
// 注: 沒有一般形式的版本, 因為容器定義了比較
- 無序容器:
size_type count(const T&) const; iterator find(const T&); std::pair<iterator, iterator> equal_range(const T&); // 注:沒有一般形式的版本,使用hash函式搜尋
對比
- 例子1:unordered_set
unordered_set<int> s = {2,4,1,8,5,9}; // Hash表
unordered_set<int>::iterator itr;
// 成員函式
itr = s.find(4); // O(1)
// 演算法
itr = find(s.begin(), s.end(), 4); // O(n)
- 例2:map
map<char, string> mymap = {{'S',"Sunday"}, {'M',"Monday"}, {'W', "Wendesday"}, ...}; // 成員函式 itr = mymap.find('F'); // O(log(n)) // 演算法 itr = find(mymap.begin(), mymap.end(), make_pair('F', "Friday")); // O(n)
- 例3:list
list<int> s = {2,1,4,8,5,9};
// 成員函式
s.remove(4); // O(n)尋找,O(1)刪除
// s: {2,1,8,5,9}
// 演算法
itr = remove(s.begin(), s.end(), 4); // O(n)尋找,O(n)刪除
// s: {2,1,8,5,9,9}
s.erase(itr, s.end());
// s: {2,1,8,5,9}
// 排序
//
// 成員函式
s.sort();
// 演算法
sort(s.begin(), s.end()); // 未定義的行為,演算法sort要求隨機訪問迭代器
// remove_if()和unique()演算法也類似
總結
通常情況下,偏向於成員函式版本。因為成員函式知道容器的資料結構,從而可以利用這一點找到最有效的方法來執行相應的任務。