zoukankan      html  css  js  c++  java
  • 【转】C++STL各容器的操作及复杂度

    vector
    内部实现: 数组 // 就是没有固定大小的数组,vector直接翻译是向量的意思
    支持操作:
    begin(), //取首个元素,返回一个iterator
    end(), //取末尾(最后一个元素的下一个存储空间的地址)
    size(), //就是数组大小的意思
    clear(), //清空
    empty(), //判断vector是否为空
    []  //很神奇的东东,可以和数组一样操作
    //举例: vector a;   //定义了一个vector
    //然后我们就可以用a[i]来直接访问a中的第i + 1个元素!和数组的下标一模一样!
    push_back(), pop_back() //从末尾插入或弹出
    insert() O(N) //插入元素,O(n)的复杂度
    erase() O(N)  //删除某个元素,O(n)的复杂度
    可以用于数组大小不定且空间紧张的情况

    deque

    类似   //双端队列,两头都支持进出
    支持push_front()和pop_front()  
    是的精简版:)  //栈,只支持从末尾进出
    支持push(), pop(), top()
    是的精简版   //单端队列,就是我们平时所说的队列,一头进,另一头出
    支持push(), pop(), front(), back()

    3  list 
    内部实现: 双向链表  //作用和vector差不多,但内部是用链表实现
    支持操作:
    begin(), end(), size(), clear(), empty()
    push_back(), pop_back()  //从末尾插入或删除元素 
    push_front(), pop_front() 
    insert() O(1)  //链表实现,所以插入和删除的复杂度的O(1)
    erase()  O(1)
    sort()   O(nlogn)
    //不支持[ ]操作!

    set

    内部实现: 红黑树 //Red-Black Tree,一种平衡的二叉排序树
    insert() O(logn)
    erase() O(logn)
    find() O(logn)
    lower_bound() O(logn) 查找第一个不小于k的元素
    upper_bound() O(logn) 查找第一个大于k的元素
    equal_range() O(logn) 返回pair

    5 multiset 允许重复元素的

    map 内部实现: pair组成的红黑树  
    //就是很多pair 组成一个红黑树
    insert() O(logn)
    erase()  O(logn)
    find()   O(logn) 找不到返回a.end()
    lower_bound() O(logn) 查找第一个不小于k的元素
    upper_bound() O(logn) 查找第一个大于k的元素
    equal_range() O(logn) 返回pair
    [key]运算符 O(logn) 太牛了

    7 multimap 允许重复元素, 没有[]运算符

      

    priority_queue
    内部实现: 堆   //优先队列

    支持操作:
    push() O(n)
    pop()  O(n)
    top()  O(1)
    See also: push_heap(), pop_heap() … in

      

    hash_map
    内部实现: Hash表//内部用哈希表实现的map

    重载HashFcn和EqualKey
    支持操作:
    insert(); O(1)
    earse();  O(1)
    [ ];      O(1)

    1.sort()
    void sort(RandomAccessIterator first, RandomAccessIterator last); 
    void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp); 
    区间[first,last)
    Quicksort,复杂度O(nlogn)
    (n=last-first,平均情况和最坏情况)

    用法举例:
    1.从小到大排序(int, double, char, string, etc)
    const int N = 5;
    int main()
    {
    int a[N] = {4,3,2,6,1};
    string str[N] = {“TJU”,”ACM”,”ICPC”,”abc”,”kkkkk”};
    sort(a,a+N);
    sort(str,str+N);
    return 0;
    }
    2.从大到小排序(需要自己写comp函数)
    const int N = 5;
    int cmp(int a,int b) {return a > b;}
    int main()
    {
    int a[N] = {4,3,2,6,1};
    sort(a,a+N,cmp);
    return 0;
    }
    3. 对结构体排序
    struct SS {int first,second;}; 
    int cmp(SS a,SS b) {
    if (a.first != b.first) return a.first < b.first;
    return a.second < b.second;
    }

    v.s. qsort() in C (平均情况O(nlogn),最坏情况O(n^2))    //qsort中的cmp函数写起来就麻烦多了!
    int cmp(const void *a,const void *b) {
    if (((SS*)a)->first != ((SS*)b)->first)
      return ((SS*)a)->first – ((SS*)b)->first;
    return ((SS*)a)->second – ((SS*)b)->second;
    }
    qsort(array,n,sizeof(array[0]),cmp);

    sort()系列:
    stable_sort(first,last,cmp); //稳定排序
    partial_sort(first,middle,last,cmp);//部分排序
    将前(middle-first)个元素放在[first,middle)中,其余元素位置不定
    e.g.
    int A[12] = {7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5}; 
    partial_sort(A, A + 5, A + 12); 
    // 结果是 "1 2 3 4 5 11 12 10 9 8 7 6". 
    Detail: Heapsort ,
    O((last-first)*log(middle-first))

    sort()系列:
    partial_sort_copy(first, last, result_first, result_last, cmp);
    //输入到另一个容器,不破坏原有序列
    bool is_sorted(first, last, cmp);
    //判断是否已经有序
    nth_element(first, nth, last, cmp);
    //使[first,nth)的元素不大于[nth,last), O(N)
    e.g. input: 7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5 
    nth_element(A,A+6,A+12);
    Output: 5 2 6 1 4 3 7 8 9 10 11 12

    2. binary_search()
    bool binary_search(ForwardIterator first, ForwardIterator last, const LessThanComparable& value); 
    bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); 
    在[first,last)中查找value,如果找到返回Ture,否则返回False
    二分检索,复杂度O(log(last-first))
    v.s. bsearch() in C

    Binary_search()系列
    itr upper_bound(first, last, value, cmp);
    //itr指向大于value的第一个值(或容器末尾)
    itr lower_bound(first, last, value, cmp);
    //itr指向不小于valude的第一个值(或容器末尾)
    pair equal_range(first, last, value, cmp);
    //找出等于value的值的范围 O(2*log(last – first))
    int A[N] = {1,2,3,3,3,5,8}
    *upper_bound(A,A+N,3) == 5
    *lower_bound(A,A+N,3) == 3

    make_heap(first,last,cmp) O(n)
    push_heap(first,last,cmp)  O(logn)
    pop_heap(first,last,cmp)  O(logn)
    is_heap(first,last,cmp)  O(n)
    e.g:
    vector vi;
    while (scanf(“%d”,&n) != EOF) {
    vi.push_back(n);
    push_heap(vi.begin(),vi.end());
    }

    Others interesting:
    next_permutation(first, last, cmp)
    prev_permutation(first, last, cmp) 
    //both O(N)
    min(a,b);
    max(a,b);
    min_element(first, last, cmp);
    max_element(first, last, cmp);

    Others interesting:
    fill(first, last, value)
    reverse(first, last)
    rotate(first,middle,last);
    itr unique(first, last);
    //返回指针指向合并后的末尾处
    random_shuffle(first, last, rand)

    Some Others:
    More container: Rope, Slist, Bitset …
    More about iterator
    Memory allocation
    Function object

  • 相关阅读:
    中文转数字
    半角全角互转
    sql快速查记录数
    杀进程批处理
    线程基本用法
    sql游标用法示例
    BUGFREE的使用
    SQL常用函数
    ASP.NET 2.0 下的验证码控件
    经典sql语句
  • 原文地址:https://www.cnblogs.com/gaojs/p/13728148.html
Copyright © 2011-2022 走看看