【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;
}

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