zoukankan      html  css  js  c++  java
  • 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()算法也类似
    

    总结

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

  • 相关阅读:
    一些数据集
    经典的图像匹配算法----SIFT
    LDA处理文档主题分布代码
    Dirichlet Process
    主题模型-LDA浅析
    matplotlib —— 添加文本信息(text)
    xgboost原理及应用
    XGBoost参数调优
    MySQL中实现Oracle里面 rank()over ( PARTITION BY ORDER BY) 分类分组功能
    4.12 省选模拟赛 LCA on tree 树链剖分 树状数组 分析答案变化量
  • 原文地址:https://www.cnblogs.com/logchen/p/10204040.html
Copyright © 2011-2022 走看看