1. 程式人生 > 實用技巧 >STL和基本資料結構

STL和基本資料結構

寫在開頭

  • 部落格中演算法的程式碼部分基本以C++來寫,還未學到的同學可以花幾分鐘先大概瞭解一下

  • 部落格中所有演算法的介紹分為知識點的部分以及對應演算法題部分。

  • 本文主要會介紹常用的STL容器(概念、適用環境、操作)以及STL中的幾個實用演算法。

STL(Standard Template Library)是C++的標準模板庫,很多競賽常用的資料結構、演算法在STL中都有,熟練掌握能極大簡化程式設計。

一、容器

STL的容器包括
①順序式/序列容器(底層主要採用向量和連結串列)
②關聯式/關聯容器(底層主要採用平衡二叉搜尋樹結構)

1. 順序式容器

順序式容器主要包括vector、list、deque、queue、priority_queue、stack等.

這裡先介紹vector、stack以及queue幾個常見的容器。

1.1 vector——向量

vector向量是動態陣列(可變長陣列):在執行時能根據需要自動改變陣列大小。
支援隨機訪問,v[]

常用操作

/*1.定義vector<type>v */
#include <bits/stdc++.h>//萬能頭,包含<vector>
vector <int> v;

/*2.新增、插入*/
v.push_back(i);//加入至尾部
v.insert(v.begin() + i, value);//加入至v[i]

/*3.訪問*/
//支援隨機訪問遍歷
for(int i = 0; i < v.size(); i++)
   cout << v[i] << " ";
//迭代器遍歷
for(auto it = vi.begin();it!=vi.end();it++)
    cout<<*it<<' '<<endl;

/*4.刪除*/
//彈出尾部
v.pop_back();
//刪除某個迭代器的元素
auto it = a.find(value)
v.erase(it)
//*刪除所有 v.clear();
//*刪除迭代器區間 去查吧!

題型

適合少量插入刪除的題目(底層是連續空間的陣列,不宜頻繁移動)
經典題型:約瑟夫問題

  • ​ hdu 4841 "圓桌問題"

拓展

​ 思考頻繁的插入刪除的題目該如何做?

1.2 stack——棧

棧是一種先進後出的容器。(可以理解為泡騰片的拿入拿出)

棧頂新增,棧頂彈出

常用操作

/*1.定義stack<type> s */
#include <bits/stdc++.h>//萬能頭,包含<stack>
stack <int> s;

/*2.新增*/
s.push(key);//入棧至棧頂

/*3.訪問*/
s.top();//只能訪問棧頂

/*4.刪除*/
s.pop()//只能彈出棧頂

題型

棧的題目特徵比較明顯:題意有先進後出意思即可

經典題型:模擬棧、反轉字串
逆波蘭/字尾表示式
DFS

  • hdu 1062 "Text Reverse"
  • hdu 1237 "簡單計算器"

拓展

​ 由於棧要用空間儲存,深度太大,會出現溢位,推薦手工寫棧。

1.3 queue——佇列

queue是一種先入先出的容器。
隊尾新增,隊首彈出

常用操作

/*1.定義queue <typename> q; */
#include <bits/stdc++.h>//萬能頭,包含<queue>
queue <int> q;

/*2.新增*/
q.push(key);//入隊至隊尾

/*3.訪問*/
q.front();//訪問隊首
q.back();//訪問隊尾

/*4.刪除*/
q.pop()//只能彈出隊首

題型

佇列的題目特徵比較明顯:題意有先進先出的意思即可

經典題型:模擬佇列
BFS

  • hdu 1702 "ACboy needs your help again"

3. 通用的操作

x.size();//返回容器元素數量
x.empty;//判斷容器是否為空

x.clear();//刪除所有元素,僅map、set、vector