zoukankan      html  css  js  c++  java
  • Cpp_queue vector stack duque map set_Note

     

    queue

    队列先进先出。访问删除操作只能在队头进行,添加操作只能在队尾进行。不能访问除对头外的其他元素。头文件 #include<queue>

    constructor

    empty 测试容器是否为空
    size 返回大小
    front 返回队首元素,不删除
    back 返回队尾元素,不删除
    push 入队,在队尾插入元素
    push_back  
    pop_front  
    emplace 构造并插入元素
    pop 出队,删除队首元素
    swap 交换内容

    priority_queue 优先队列

    默认大的先出队,想使小的先出队,可定义 

    priority_queue<int,greater> q;

    对于非基本数据类型——重载比较运算符

    Struct node{
        int x, y;
        bool operator < (node a, node b){
            return a.x > b.x;
        }
    }
    
    Priority_queue<node> q;

    例题

    02_M_ugly num

    #include <iostream>
    #include <queue>
    #include <set>
    #include <vector>
    using namespace std;
    typedef long long ll;
    const int th=1500;
    
    int main(){
        int ug[3]={2,3,5},i,j;
        ll x,y;
        priority_queue< ll,vector<ll>,greater<ll> > ugnum;
        set<ll> se;
        
        ugnum.push(1);
        se.insert(1);
        for(i=1;i<=th;i++){
            x=ugnum.top();
            ugnum.pop();
            for(j=0;j<3;j++){
                y=x*ug[j];
                if(!se.count(y)){
                    se.insert(y);ugnum.push(y);
                }
            }
        }
        cout<<"The 1500'th ugly number is "<<x<<"."<<endl;
    }

     

    vector

    vector是一个能够存放任意类型的动态数组。头文件#include<vector>

    · 定义和初始化

    vector<T>v1 v1是空vector,元素是T类型的,默认初始化
    vextor<T>v2(v1) v2中包含v1所有元素的副本
    vector<T>v2=v1  
    vector<T>v3(n,val) v3包含n个重复元素,每个元素的值都是val
    vector<T>v4(n) v4包含n个重复执行值初始化的元素
    vector<T>v5{a,b,c,...} v5包含初始值葛素的元素,被赋予相应的初始值
    vector<T>v6={a,b,c,...}  
    vector<int>b(a.begin(),a.begin()+3) 将a向量中第0个到第二个作为b向量的初始值
    vector<int>a(&n[1],&n[4]) 将n[1]-n[4]范围内的元素作为向量a的初始值

    · vector支持的操作

    v.empty() v为空返回true,否则返回false
    v.size() 返回v中元素个数
    v.push_back(t) 向v的末尾添加一个值为t的元素
    v.pop_back() 删除v末尾的元素,如果v为空,行为未定义
    v[n] 返回v中第n个位置上的元素的引用,位置n从0开始计
    v.at(n) (cin>>v.at(0);) 返回v中第n个位置上的元素的引用,下标越界抛出异常
    v.clear 清空向量中的元素
    v1 = v2 赋值
    v = {a,b,c,...} 替换
    v1 == v2           v1 != v2 v1和v2相等当且仅当他们的元素数目相同且对应位置元素相同
    <,<=,>,>= 以字典顺序进行比较
    a.insert(a.begin(), 10) ;                      //将10插入到向量a的起始位置前
    a.insert(a.begin(), 3, 10);                   //将10分别插入到向量a的0-2处
    b.insert(b.begin(), a.begin(), a.end()); //将a插入到b.begin前
    a.erase(a.begin());                             //将起始位置的元素删除
    a.erase(a.begin(), a.begin() + 3);        //将a的0-3处元素删除
    a.swap(b);                                         //将向量a与向量b交换
    

    访问:迭代器

    vector<int>::iterator it;
    for(it=a.begin();it!=a.end();it++)
        cout<<*it<<" ";

    vector<T>类型对象的下标类型是vector<T>::size_type。

    list

    线性的双向链表,相对于verctor占用更多内存。头文件 #include<list>

    list<string>s;
    s.push_back("world");                        //插入
    s.push_front("hello");
    list<string>::iterator it;                     //遍历
    for(it = s.begin(); it != s.end();t++)
      cout<<*it<<" ";

    主要函数

    begin() 返回指向第一个元素的迭代器
    end() 返回末尾的迭代器
    front() 返回第一个元素
    back() 返回最后一个元素
    insert() 插入一个元素到list中
    remove_if() 按指定条件删除元素
    clear() 删除所有元素
    empty() 判断是否为空
    pop_back() 删除最后一个元素
    pop_front() 删除第一个元素
    push_back() 在末尾添加一个元素
    push_front() 在头部添加一个元素
    reverse() 把list的元素倒转
    size() 返回元素个数
    sort() 排序
    splice() 合并两个list
    swap() 交换两个list
    unique() 删除重复元素

    find进行list查找元素x

    (vector是顺序容器,没有find函数

    vector<int> v;
    vector<int>:: iterator it;
    it = find(v.begin(), v.end(),  x);
    cout << *it << endl;

    stack

    栈又名堆栈,是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。头文件 #include<stack>容器类型默认由双端队列deque实现,只允许在栈的尾部进行入栈和出栈操作。

    基本用法:

    empty() 判断是否为空
    size() 返回栈的元素个数
    top() 返回栈顶元素
    push() 入栈
    pop() 出栈,无返回值

    例题

    02_J_rails

    多组输入输出,每组输入第一行为列车长度,之后为列车车厢排列(以“0”标记结束)判断是否能够得到该排列输出“Yes”or“No”,每组输出之间空一行,以“0”标记输入结束。

    AC代码:

    #include <iostream>
    #include <stdio.h>
    #include <stack>
    const int MAX=1000;
    using namespace std;
    
    int main(){
        int n,tra[1000];
        int i;
        //freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        stack<int>s;                    
        scanf("%d",&n);
        while(n!=0)      
        {   
            while(scanf("%d",&tra[0])==1&&tra[0]!=0){   
            for(i=1;i<n;i++){
                scanf("%d",&tra[i]);
            }
            int A=1,B=0;
            bool ok=1;
            while(B<n){
                if(A==tra[B]){++A;++B;}
                else if(!s.empty()&&s.top()==tra[B]){
                    s.pop();++B;
                }
                else if(A<=n){
                    s.push(A);++A;      //等价于s.posh(A++); 
                }
                else {ok=0;break;}
            }
            printf("%s
    ",ok ? "Yes":"No");
            }
            scanf("%d",&n);
            printf("
    ");
        }
        return 0; 
    } 

    02_K_balance

    给定一串由()和[]组成的字符串。如果我们规定以下的字符串是合法的字符串:
    (1) 如果是空串,那么合法字符串。
    (2) 如果A、B是合法的,那么AB也是合法的字符串。
    (3) 如果A是合法的,那么(A)和[A]都是合法的字符串。

    输入n表示有n个字符串,空行合法,输出“Yes”or“No”。

    AC代码:

    #include <stdio.h>
    #include <iostream>
    #include <stack>
    #include <string.h>
    
    using namespace std;
    
    int main(){
        //freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
        int n,lo,i,t;
        string ch;
        cin>>n;
        t=n+1;
        while(t--){
            getline(cin,ch,'
    ');
            bool ok=1;
            if(ch=="0")ok=1;
            stack<char> s;
            lo=0;i=0;
            while(ch[i]){
                  ++lo;
                  ++i;
            }
            for(i=0;i<lo;i++){
                if(ch[i]=='('){s.push(ch[i]);}
                else if(ch[i]=='['){s.push(ch[i]);}
                else if(!s.empty()&&ch[i]==']'&&'['==s.top()){
                    s.pop();
                }
                else if(!s.empty()&&ch[i]==')'&&'('==s.top()){
                    s.pop();
                }
                else {
                    ok=0;
                    break;
                }
            }
            if(s.size())ok=0;
            if(t!=n)printf("%s
    ",ok?"Yes":"No");
        }
        return 0;
    } 

     duque

    双端队列,在功能上合并了vector和list

    优点:1、支持[ ]操作符和vector.at()

          2、在内部方便的进行插入和删除操作    

       3、可在两端进行push、pop

    缺点:占用内存多

    map

    set

    STL常用算法

    unique(v.begin(), v.end());    //将相邻重复元素全部放到最后 
    sort(v.begin(), v.end());    //排序,默认从小到大
    a.find(‘c’, i)    //在a中从第i个位置开始找’c’,第二个参数可省略
    count(v.begin(), v.end(), x)    //在v中统计x出现次数
    copy(v.begin(), v.end(), u.begin());//将v中元素复制到u中
    reverse(v.begin(), v.end());    //将v中元素翻转
  • 相关阅读:
    linux学习笔记三
    linux学习笔记二
    linux学习笔记一
    Linux操作篇之配置DNS服务(二)
    Linux操作篇之配置DNS服务(一)
    Linux操作篇之配置DHCP服务
    Linux操作篇之配置SSH服务
    Linux操作篇之自动化安装操作系统(二)
    Linux操作篇之自动化安装操作系统(一)
    Linux的shell编程篇之环境变量配置文件
  • 原文地址:https://www.cnblogs.com/anonym/p/8284897.html
Copyright © 2011-2022 走看看