• std::find ,set.find, multiset.find, map.find和multimap.find算法总结 Hibernate4 博客园


    std::find ,set.find, multiset.find, map.find和multimap.find算法总结 - Hibernate4 - 博客园

    std::find ,set.find, multiset.find, map.find和multimap.find算法总结

    这几天对到底选用哪个容器,用哪种形式的find函数有一些迷惑的地方。
    工作之后,花些时间对这些常用的东西做一个总结,方便以后翻阅所用。

    1.通用std::find 函数

     

    例子1:

     
    std::find函数的确有很好的通用性,但是也有很大的缺点,就是算法的效率不高,算法的复杂度为O(n)。无码无真相,让我们看一下 std::find 算法 SGI实现版本:

    template
    inline _InputIter find(_InputIter __first, _InputIter __last,
    const _Tp& __val,
    input_iterator_tag)
    {
    while (__first != __last && !(*__first == __val))
    ++__first;
    return __first;
    }

    我们可以看到如果找不到,最后find将会返回 last,切记这里的last而非容器的最后一个元素,而是容器的最后。如果想深入了解,请参照《STL源码分析》或者《C++标准程序库》。
    (*PS,如果仅仅查找一个元素是否存在,用find_if会更明了一些,虽然find和find_if的算法复杂度是相当的。)

    2.特定容器的find算法。
    当数据量是百万或者千万级的时候,std::find的O(n)算法就让程序或者客户感到销魂了。
    这时候我们可以考虑使用map或者set的算法。是的,这里的find,是map和set的一个成员函数,一个研究ACM的朋友,告诉我map和set中的find算法是用红黑树来实现的。拿起之前的算法的资料,了解到黑红输有良好的最坏情况运行时间,算法复杂度为O(logn)。
    这样,百万或者千万级的查找就不再话下了。


    3.最后有必要说一下就是multimap 和 multiset 的find 。因为这两个容器都可以存放相同键值的数据。所以说find一个键值本可以返回多个结果,但是你这样想就错了。multiset 和multimap只会返回第一个结果。如果要得到相同的键值的所有结果可以用以下的方式,还要需要注意的一点set,map是重载了[]操作符的,所以可以像数组或者vector那样直接访问,但是multiset和multimap是没有的,所以必须要用find一类的方法。(multiset同理此处略去)


    3. boost bimap和 boost unordered_map的find方法。

    因为此处重点对STL的说明,关于bimap和unordered_map的find方法,请参看本博客下一篇博文。

  • 相关阅读:
    SQLite学习第02天:数据类型
    SQLite学习第01天:参考资料
    利用OllyDebug查看程序调用的dll模块
    Qt文件信息获取之QFileInfo
    Qt标准对话框之QColorDialog
    Windows平台下Qt开发环境的搭建
    何时使用引用参数(转)
    OpenCV2学习笔记01:Linux下OpenCV开发环境的搭建
    node实现缓存
    node进阶之用流实现上传文件
  • 原文地址:https://www.cnblogs.com/lexus/p/2987314.html
Copyright © 2020-2023  润新知