Stl的簡單學習之set map容器

2021-08-27 20:45:54 字數 3119 閱讀 2724

我從大一接觸到sort()快速排序函式以後,逐漸接觸到了stl,並產生了興趣,斷斷續續地學習了stl的一些容器還有函式,大部分都只學習了用法和一些注意事項,少部分看了原始碼,所以本週我只簡單提一些用法。

我首先簡單介紹一下容器。

1、順序容器:是一種各元素之間有順序關係的線性表,是一種線性結構的可序群集。順序性容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。順序容器的元素排列次序與元素值無關,而是由元素新增到容器裡的次序決定。順序容器包括:vector(向量)、list(列表)、deque(佇列)。

2、關聯容器:關聯式容器是非線性的樹結構,更準確的說是二叉樹結構。各元素之間沒有嚴格的物理上的順序關係,也就是說元素在容器中並沒有儲存元素置入容器時的邏輯順序。但是關聯式容器提供了另一種根據元素特點排序的功能,這樣迭代器就能根據元素的特點「順序地」獲取元素。元素是有序的集合,預設在插入的時候按公升序排列。關聯容器包括:map(集合)、set(對映)、multimap(多重集合)、multiset(多重對映)。

3、容器介面卡:本質上,介面卡是使一種不同的行為類似於另一事物的行為的一種機制。容器介面卡讓一種已存在的容器型別採用另一種不同的抽象型別的工作方式實現。介面卡是容器的介面,它本身不能直接儲存元素,它儲存元素的機制是呼叫另一種順序容器去實現,即可以把介面卡看作「它儲存乙個容器,這個容器再儲存所有元素」。stl 中包含三種介面卡:棧stack 、佇列queue 和優先順序佇列priority_queue 。

容器類自動申請和釋放記憶體,因此無需new和delete操作。

由於網上的的說明也比較多,我這裡就根據一些例題介紹一些容器的用法。

一、set

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數(n ≤ 100),對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成「去重」與「排序」的工作。

輸入有2行,第1行為1個正整數,表示所生成的隨機數的個數:n

第2行有n個用空格隔開的正整數,為所產生的隨機數。

輸出2行,第1行為1個正整數m,表示不相同的隨機數的個數。

第2行為m個用空格隔開的正整數,為從小到大排好序的不相同的隨機數。

示例1

10

20 40 32 67 40 20 89 300 400 15

8

15 20 32 40 67 89 300 400

set裡每個值都唯一,而且自動排序,採用的是紅黑樹,但是set的值不能隨便改變,這道題很容易想到set,下面是我的ac**。

#include using namespace std;

set < int > last;

int main()

cout<::iterator num = last.begin();//迭代器訪問

for( int i = 0 ; i < last.size() - 1 ; i++ )

cout<<*num;//輸出保證末尾沒有空格

}

二、map

自動建立key - value的對應。key 和 value可以是任意你需要的型別。根據key值快速查詢記錄,查詢的複雜度基本是log(n),下面是一道pta例題。

/*實現qq新帳戶申請和老帳戶登陸的簡化版功能。最大挑戰是:據說現在的qq號碼已經有10位數了。

輸入格式:

輸入首先給出乙個正整數n(≤10?5??),隨後給出n行指令。

每行指令的格式為:「命令符(空格)qq號碼(空格)密碼」。

其中命令符為「n」(代表new)時表示要新申請乙個qq號,後面是新帳戶的號碼和密碼;命令符為「l」(代表login)時表示是老帳戶登陸,後面是登陸資訊。

qq號碼為乙個不超過10位、但大於1000(據說qq老總的號碼是1001)的整數。密碼為不小於6位、不超過16位、且不包含空格的字串。

輸出格式:

針對每條指令,給出相應的資訊:

1)若新申請帳戶成功,則輸出「new: ok」;

2)若新申請的號碼已經存在,則輸出「error: exist」;

3)若老帳戶登陸成功,則輸出「login: ok」;

4)若老帳戶qq號碼不存在,則輸出「error: not exist」;

5)若老帳戶密碼錯誤,則輸出「error: wrong pw」。

輸入樣例:

5l 1234567890 [email protected]

n 1234567890 [email protected]

n 1234567890 [email protected]

l 1234567890 myqq@qq

l 1234567890 [email protected]

輸出樣例:

error: not exist

new: ok

error: exist

error: wrong pw

login: ok

*/#includeusing namespace std;

map < string , int > qq;

map < int , string > pwr;

int qq;

int pw;

int main(){

// ios::sync_with_stdio(false);

// cin.tie(0);

int t;

cin>>t;

getchar();

while( t-- ){

char judge;

scanf("%c",&judge);

getchar();

string name;

string pw;

cin>>name;

cin>>pw;

getchar();

// getline( cin , name );

// getline( cin , pw );

if( judge == 'l' ){

if( !qq[name] ){

cout<<"error: not exist"《可能我的做法有些欠妥,希望還是能幫助到大家,這週就寫到這裡。

STL之關聯式容器set map

1.管理元素集合的stl容器大致分為兩類,序列式容器 有順序的集合 和關聯式容器 經過排序的集合 2.關聯式容器再管理資料的過程中會自動給元素排序。其優點在於可以隨時採用二分搜尋法,搜尋元素的效率極高。1.set是根據元素值進行排序的集合,所插入的元素在集合中唯一,不存在重複元素。1.include...

STL學習篇 vector的簡單使用

vector,乙個動態陣列!在堆中操作,元素連續存放,可以直接訪問其中的任何元素,初始分配有記憶體,當保留記憶體不夠的時候,會再分配記憶體 下面看乙個vector的建構函式例子 1 include 2 include3 include45 intmain 633 34for vector size ...

C 之STL庫簡單介紹

1.sort 可以自己定義新的結構體陣列排序,sort第三個引數可以設定為根據哪個值排序 int a int n sizeof a sizeof int sort a,a n for int i 0 i2.string string s 46237879426 排序 sort s.begin s.e...