【PAT甲级笔记】STL里的常用结构和函数

函数篇:

- sort函数:

可以给结构体,向量(vector),列表等进行排序
参数为(首地址,首地址+元素个数,cmp)
cmp可以自定义给对应的比较函数,默认为升序,要想该如下:

//改成降序仅需要如下代码,sort(a[0],a[0]+10,cmp)
bool cmp(int a,int b)
{
    return a>b;
}
  • sort()函数可以对vector进行排序,但排序时需要给cmp比较函数
    在这里插入图片描述

- find 函数

当使用STL时,如果使用a.find()函数,如果在查找范围内不存在,返回a.end(),这里需要注意的是,a.end()不在查找范围内。

//通常的用法:用于判断循环边界
while(a.find(c)!=end)
{
	//进入循环
}

类型篇:

- vector类型

  1. 首地址并不能使用:a 这种数组的写法。如:fill(a,a+10,0),若a为vector型会报错。
  • a.begin()被用来给出对应首地址
  • a.end()被用来给出对应结束的地址。
    (在fill()填充函数和sort()排序函数中进行了对应实验。)
  1. 使用vector开结构体时,需要resize()特定大小,不然会卡住,可能是内存占用过多的缘故

  2. 如果直接使用

- vector<int> a

- a[i]=1;
则应制定a的大小,指定方式为
- 1.方法一:vector<int> a(k);
- 2.方法二:a.resize(n);

如果使用时为:
a.push_back(1);
则不用指定大小

- map类型

map类型为从任意一种基本类型映射到任意一种基本类型的类型键值对的字典集合。最常见的映射关系为int 到int 的数组: 如a[0] = 500。
如果该键不存在,默认的值初始化为0
定义类型:

//定义类型如:
map<string set<int> a

//访问元素,使用对应的迭代器实现:
map<string set<int> :: iterator it;
key = it-->first;
value = it-->second; 

unordermap类型

-queue类型

先进先出的一个容器。

queue.push()
将数据放入
queue.pop()
弹出队首数据

queue.front()
表示队首元素
queue.back()
表示队尾元素

- set类型

set类型为内部自动有序,且不含重复元素的集合。在代码中使用可以自动排序降低思维量。
set类型操作:

//插入数据: yes 66 77 insert用法为set类型的函数
a[yes].insert(66);
a[yes].insert(77);

//set的访问只能通过迭代器的形式:
set<int> :: iterator it;
//常用在循环取出对应的值:
for(set<int>:: iterator it==a.begin();it!=a.end();it++)
//不能使用it<a.end()这种模式
printf("%d", *it); 

- string类型

  • str.c_str()与const char 相互转换
  • str.substr(i1,i2):截取从i1开始的,长度为i2的字串

其他

在这里插入图片描述

STL题目举例

PAT 1022

  • 传入参数一定要传入引用,否则容易超时
#include<algorithm>
#include<iostream>
#include<set>
#include<stdio.h>
#include<map>
using namespace std;

map<string, set<int> > title, auther, keys, publisher, years;
int n,id,m,chose;


void query(map<string, set<int> > &m, string &temp)
{
    if(m.find(temp)!=m.end())
    {
        for(set<int>::iterator it=m[temp].begin();it!=m[temp].end();it++)
            printf("%07d\n",*it);
    }
    else printf("Not Found\n");
}
int main()
{
    scanf("%d", &n);
    string ti,au,ke, pu,ye;
    for(int i=0;i<n;i++)
    {
        scanf("%d\n", &id);
        getline(cin, ti);
        title[ti].insert(id);
        getline(cin,au);
        auther[au].insert(id);
        while(cin>>ke)
        {
          keys[ke].insert(id);
          char c=getchar();
          if(c=='\n')
            break;
        }
        getline(cin, pu);
        publisher[pu].insert(id);
        getline(cin, ye);
        years[ye].insert(id);
        //cout<<id<<" "<<ti<<" "<<au<<" "<<ke<<" "<<pu<<" "<<ye<<endl;
    }
    scanf("%d", &m);
    for(int i=0;i<m;i++)
    {
        scanf("%d: ",&chose);
        string temp;
        getline(cin,temp);
        cout<<chose<<": "<<temp<<endl;
        if(chose==1)query(title,temp);
        else if(chose==2) query(auther,temp);
        else if(chose==3) query(keys,temp);
        else if(chose==4) query(publisher,temp);
        else if(chose==5) query(years,temp);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章