STL进阶--成员函数 vs 算法

Posted logchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL进阶--成员函数 vs 算法相关的知识,希望对你有一定的参考价值。

容器的成员函数 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()算法也类似

总结

通常情况下,偏向于成员函数版本。因为成员函数知道容器的数据结构,从而可以利用这一点找到最有效的方法来执行相应的任务。

以上是关于STL进阶--成员函数 vs 算法的主要内容,如果未能解决你的问题,请参考以下文章

C++ 成员函数指针和 STL 算法

是否可以直接将依赖于实例的成员函数(方法)从另一个成员函数传递给 STL 的算法?

STL进阶--相等 vs 等价 (Equality vs Equivalence)

STL进阶--vector vs deque

STL进阶--删除元素

C++进阶-2-STL初识(容器算法迭代器等)