zoukankan      html  css  js  c++  java
  • C++学会STL

    1.1 泛型程序设计简介

      泛型程序设计,简单地说就是使用模板的程序设计法。将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。

      总而言之,不多赘述,有了STL,不必再从头写大多的标准数据结构和算法,并且可获得非常高的性能。

    1.2迭代器

    • 可遍历STL容器内全部或部分元素的对象
    • 指出容器中的一个特定位置
    • 所有容器都提供获得迭代器的函数
    操作 效果
    begin() 返回一个迭代器,指向第一个元素
    end() 返回一个迭代器,指向最后一个元素之后
     
      半开区间[beg, end)的好处:
      1.为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达end(),循环就可以继续)
      2.不必对空区间采取特殊处理(空区间的begin()就等于end())
    2.常见的STL容器及其例题应用
    2.1Sort
    头文件: <algorithm>
    格式:
    sort(vect.begin(), vect.end());
    sort(vect.begin(), vect.end(), less<int>() );
    第三个参数可以自定义,主要用于自定义类型的排序
    2.2Vector
    2.2.1用法:
    vector<类型> 名字; 
    例如 vector<int> ve; vector<string> ve;
    自己定义的结构体什么的也可以往里塞
    struct POINT
    {
        int x, y;
    };
    vector<POINT> ve;

    2.2.2基本操作
    ve.push_back(const value_type &val); 
    作用是在数组后面增加一个元素。括号里填的是ve里装的东西
    ve.clear();清空ve里的所有元素。
    ve.empty();判断ve是否为空,如果是返回true,否则false
    ve.size();返回ve的长度。注意这里返回的类型是unsigned int,如果ve是空的ve.size() - 1就会爆掉。使用的时候一定要小心(做TC的时候被坑了一次)
    ve.pop_back() 删除数组里的最后一个元素。
    2.3 Set
    2.3.1用法:
    set<类型> 名字; 
    例如 set<int> se; set<string> se;
    自己定义的结构体什么的也可以往里塞
    struct POINT
    {
        int x, y;
    };
    set<POINT> se;

    2.3.2基本操作对集合a中元素的有
    插入元素:a.insert(1);
    删除元素(如果存在):a.erase(1);
    判断元素是否属于集合:if (a.find(1) != a.end()) ...
    返回集合元素的个数:a.size()
    将集合清为空集:a.clear()
     
    2.4 Map
    2.4.1用法:
    map添加数据;
    map<int ,string> maplive;  //第一个是键值,第二个是值
    1.maplive.insert(pair<int,string>(102,"aclive"));
    2. maplive[112]="April";//map中最简单最常用的插入添加!
    map中查找数据:
    第一种:用count 函数来判定关键字是否出现,其缺点是无法定位数据出现位置,
    由于map 的特性,一对一的映射关系,就决定了count 函数的返回值只有两个,
    要么是0,要么是1,出现的情况,当然是返回1 了
    第二种:用find 函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map 中没有要查找的数据,它返回的迭代器等于end 函数返回的迭代器
    注意:
    Map中的元素是自动按key升序排序,所以不能对map用sort函数
    但可以用迭代器按序遍历(与set类似)
    2.5 Queue
    2.5.1
    用法
    和vector一样。
    queue<int> qu; 
    queue<POINT> qu;
    我一般都用它在BFS的时候存点。

    2.5.2 常用操作
    qu.push(const value_type &val); 元素入队
    qu.pop()元素出队
    qu.front() 获得队首元素
    qu.empty() 判断qu是否为空,是的话返回true
    qu.size() 获得qu的大小。
    2.6 priority_queue(优先队列):默认从大到小排列。
     
    2.6.1用法
    priority_queue<int> pqu;
    如果要装结构体的话,要重载结构体的小于号,或者自己写一个cmp函数。
    struct cmp
    {
    operator bool ()(int x, int y)
    {
    return x > y; // x小的优先级高
         }
    };
    priority_queue<int, vector<int>, cmp>q;//第二个参数为容器类型。第三个参数为比较函数。
    priority_queue<vector<int>, less<int>> pq1; // 使用递减less<int>函数对象排序
    priority_queue<deque<int>, greater<int>> pq2; // 使用递增greater<int>函数对象排序
    常用操作
    push(),top(),pop(),empty();
    2.7 next_permutation(全排列):要包含头文件<algorithm>
    2.7.1用法
    与之完全相反的函数还有prev_permutation
    a[0]=1;a[1]=2;a[2]=3;
    do{cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;}while (next_permutation(a,a+3)); 
    输出:
     1 2 3
     1 3 2
     2 1 3
     2 3 1
     3 1 2
     3 2 1
    如果改成 while(next_permutation(a,a+2));
    则输出:
     1 2 3
     2 1 3
    只对前两个元素进行字典排序
  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/jjzzx/p/5391366.html
Copyright © 2011-2022 走看看