STL小结

S T L ( S t a n d a r d   T e m p l a t e   L i b r a r y ) \mathcal{STL}(\mathcal{Standard\ Template\ Library}) STL(Standard Template Library)


  1. q u e u e queue queue (队列):

    这是一种先进先出的数据结构,主要操作有

    操作功能
    f r o n t ( ) front() front()返回队尾元素的值
    p o p ( ) pop() pop()弹出队头元素
    p u s h ( x ) push(x) push(x) x x x 压入队尾
    e m p t y ( ) empty() empty()如果队列为空,返回 t r u e true true
    s i z e ( ) size() size()返回当前队列内元素个数
    海港 O J \mathcal{OJ} OJ

    这道题主要思路是用一个队列维护时间,再用一个队列记录这个人的国籍

    代码:
    #include <queue>
    #include <cstdio>
    using namespace std;
    const int TIME = 86400;
    int n, Countries_, t, k, x, f[ 100005 ];
    queue <int> Time, PeoPle;
    int main () {
        scanf ("%d", &n);
        for (int i = 1; i <= n; i ++) {
            scanf ("%d %d", &t, &k);
            while (k --) {
                Time.push(t);
                scanf ("%d", &x);
                PeoPle.push(x);
                Countries_ += f[ x ] == 0 ? 1 : 0;//当这个人是该国家唯一到达的人时,国家数加加
                f[ x ] ++;
            }
            while (Time.empty() == false and t - Time.front() >= TIME) {//在每艘船到达后,维护队列,将不满足条件的人弹出队列,并判断该国是否有人在24小时内到达
                Time.pop();
                if (-- f[ PeoPle.front() ] == 0) {
                    Countries_ --;
                }
                PeoPle.pop();
            }
            printf ("%d\n", Countries_);
        }
        return 0;
    } 
    

  1. s t a c k ( stack( stack( ) ) )

    在我看来,栈与队列相当于孪生兄弟,但是队列 p o p ( ) pop() pop() 弹出队头元素,先进先出;栈 p o p ( ) pop() pop() 弹出栈顶元素,先进后出
    栈
    主要操作:
    操作功能
    t o p ( ) top() top()返回栈顶元素的值
    p o p ( ) pop() pop()弹出栈顶元素
    p u s h ( x ) push(x) push(x) x x x 压入栈顶
    e m p t y ( ) empty() empty()如果栈顶元素为空,返回 t r u e true true
    s i z e ( ) size() size()返回当前栈内元素个数
    例题 表达式括号匹配 O J \mathcal{OJ} OJ
    思路:如果当前第i位是右括号, 则判断如果前面有左括号且并未用过。若有,将其弹出栈,否则直接输出 N O NO NO
    代码:
    #include <stack>
    #include <cstdio>
    using namespace std;
    stack <char> s;
    int n;
    char c;
    int main () {
    	while (scanf ("%c", &c) != EOF && c != '@') {
    		if (c == '(') {//如果c是左括号,将其push进栈,以便于后面判断
    			s.push(c);
    		}
    		else if (c == ')') {
    			if (s.empty() == true) {//如果栈为空,即前方无可用左括号,则输出"NO"
    				puts("NO");
    				return 0;
    			}
    			s.pop();//若有可用左括号,将左括号弹出,当成已用过
    		}
    	}
    	if (s.empty() == true) {//如果左括号用完,输出"YES"
    		puts("YES");
    		return 0;
    	}
    	puts("NO");
    	return 0;
    } 
    

  1. v e c t o r vector vector(顺序容器,不定长数组):

    和数组差不多,但比数组优越。特征是相当于可分配拓展的数组。它的随机访问、在末端插入和删除快,但在中间插入和删除慢。
    主要操作:
    操作功能
    p u s h _ b a c k ( x ) push\_back(x) push_back(x) v e c t o r vector vector 的末尾插入变量 x x x
    p o p pop pop_ b a c k ( ) back() back()去掉 v e c t o r vector vector 的末尾数据
    f r o n t ( ) front() front()返回 v e c t o r vector vector 第一个元素
    b e g i n ( ) begin() begin()返回 v e c t o r vector vector 头的指针
    e n d ( ) end() end()返回 v e c t o r vector vector 最后一个单元 + 1 +1 +1 的指针
    c l e a r ( ) clear() clear()清除 v e c t o r vector vector 所有数据
    e m p t y ( ) empty() empty()如果 v e c t o r vector vector 为空,返回 t r u e true true
    e r a s e ( t ) erase(t) erase(t)删除t位置的数据
    e r a s e ( B e g i n , E n d ) erase(Begin, End) erase(Begin,End)删除 [ B e g i n , E n d ) [Begin, End) [Begin,End) 区间的数据
    s i z e ( ) size() size()返回当前 v e c t o r vector vector中数据个数
    i n s e r t ( t , d a t a ) insert(t, data) insert(t,data)在t处插入数据 d a t a data data

  1. m a p map map(关联容器、有序无重复):

    它提供一对一(其中第一个称为关键字,每个关键字只在 m a p map map 中出现一次,第二个称为该关键字的值)的数据处理能力
    注意:
    1. m a p map map 内部所有的数据都是有序的(红黑树)
    2. 对于迭代器来说,可以修改实值,但不能修改 k e y key key
    例题 词典 O J \mathcal{OJ} OJ
    代码:
    #include <map> 
    #include <cstdio>
    #include <iostream>
    using namespace std;
    map <string, string> Dictionary;
    string s, s2;
    char a[ 155 ], b[ 155 ];
    int main () {
    	while (getline(cin, s, '\n')) {
    		if (s == "") {
    			break;
    		}
    		sscanf(s.c_str(), "%s %s", a, b);
    		Dictionary[ b ] = a;
    	}
    	while (cin >> s) {
    		if (Dictionary[ s ] == "\0") {
    			puts("eh");
    		}
    		else {
    			cout << Dictionary[ s ] << endl;
    		}
    	}
    	return 0;
    }
    

  1. s e t set set(关联容器,集合):

    s e t set set是“集合”的意思, s e t set set 中元素都是唯一的,默认情况下会对元素自动进行升序排列,如果需要集合中的元素允许重复那么可以使用 m u l t i s e t multiset multiset

    主要操作:
    操作功能
    b e g i n ( ) begin() begin()返回 s e t set set 中的第一个元素
    e n d ( ) end() end()返回 s e t set set 中的最后一个元素
    c l e a r ( ) clear() clear()删除 s e t set set 中的所有数据
    e m p t y ( ) empty() empty()如果 s e t set set 为空,返回 t r u e true true
    i n s e r t ( ) insert() insert()插入一个元素
    e r a s e ( ) erase() erase()删除一个元素
    s i z e ( ) size() size()返回当前 s e t set set中元素个数
    c o u n t ( ) count() count()返回 s e t set set中某个值元素的个数
    f i n d ( ) find() find()返回一个指向被查找到元素的迭代器
    l o w e r _ b o u n d ( ) lower\_bound() lower_bound()返回指向第一个 ≥ \geq 某个值的元素的迭代器
    u p p e r _ b o u n d ( ) upper\_bound() upper_bound()返回第一个>某个值的元素的迭代器
    提示:若想让 s e t set set 以降序排序,可使用 s e t < i n t ,   g r e a t e r   < i n t >   > set<int,\ greater\ < int >\ > set<int, greater <int> >

  1. p r i o r i t y _ q u e u e priority\_queue priority_queue(优先队列)

    定义:任何时刻,队首元素一定是当前队列中优先级最高(优先值最大)的那一个(大根堆),也可以是最小的那一个(小根堆),可以不断向优先队列中添加某个优先级的元素,也可以不断弹出优先级最高的元素,每次操作会自动调整结构,始终保证队首元素的优先级最高。(懵逼 )

    主要操作:
    操作功能时间复杂度
    p u s h ( ) push() push() x x x 加入优先队列 O ( l o g 2 n ) , n O(log_2{n}),n O(log2n),n 为元素个数
    p o p ( ) pop() pop()队首元素出队 O ( l o g 2 n ) , n O(log_2{n}),n O(log2n),n 为元素个数
    t o p ( ) top() top()获得队首元素 O ( 1 ) O(1) O(1)
    e m p t y ( ) empty() empty()如果优先队列为空,返回 t r u e true true O ( 1 ) O(1) O(1)
    s i z e ( ) size() size()返回 p r i o r i t y _ q u e u e priority\_queue priority_queue 内元素的个数 O ( 1 ) O(1) O(1)

    重点:

    p r i o r i t y _ q u e u e < i n t >   q   < = >   p r i o r i t y _ q u e u e < i n t ,   v e c t o r < i n t > ,   l e s s < i n t >   >   q priority\_queue<int>\ q\ <=>\ priority\_queue<int,\ vector<int>,\ less<int>\ >\ q priority_queue<int> q <=> priority_queue<int, vector<int>, less<int> > q (升序)
    p r i o r i t y _ q u e u e < i n t ,   v e c t o r < i n t > ,   g r e a t e r < i n t >   >   q priority\_queue<int,\ vector<int>,\ greater<int>\ >\ q priority_queue<int, vector<int>, greater<int> > q (降序)

    例题 合并果子 O J \mathcal{OJ} OJ

    代码:

    #include <cstdio>
    #include <queue> 
    #include <vector>
    using namespace std;
    priority_queue <int,vector<int>,greater<int> > q;//升序
    int n, a, tot;
    int main () {
        scanf ("%d", &n);
        for (int i = 1; i <= n; i ++) {
            scanf ("%d", &a);
            q.push (a);
        }
        for (int i = 1; i < n; i ++) {//贪心
            int x = q.top ();
            q.pop ();
            x += q.top ();
            q.pop ();
            q.push (x);
            tot += x;
        }
        printf ("%d\n", tot);
        return 0;
    }
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值