#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
c++ stl是非常好用c++封裝的官方庫 學會使用stl在寫代碼的時候非常有幫助
vector的基本用法
vector可以簡單理解爲是一個動態數組 這裏只介紹最簡單的用法 關於容量以及如何動態擴容暫時不講
vector基本用法 vector<int> v; int可以被任意替換 char string 或者自建的struct或class都可以
*/
vector<int> mp[10005];
int main()
{
vector<int> v;
v.push_back(1); //將元素按順序加入vector
v.push_back(2);
v.push_back(3);
printf("%d", v.size()); //v.size()爲vector內部目前元素個數 當前爲3
//vector的遍歷 vector遍歷方法有很多,個人覺得簡單的兩種
for (int i = 0; i < v.size(); i++)
printf("%d", v[i]); //該方法就把vector當正常的數組使用
/*
c++11使用的迭代器遍歷法,迭代器是stl容器比較重要的概念 只爲刷題也可以不瞭解可以簡單理解爲指針,比較重要的概念
begin()爲初始第一個元素 end()表示最後一個元素之後的位置 例如下面的遍歷結束條件爲 it != v.end() 爲end()則直接跳過
也可以利用這個性質套用到官方函數上 例如快排函數 假設數組元素是 a[0]~a[n-1]排序是 爲sort(a,a+n)
因此 vector的快排爲 sort(v.begin(),v.end())
*/
for (auto it = v.begin(); it != v.end(); it++)
printf("%d", *it);
v.clear(); //clear() 爲清空vector
/*
vector做題用到最多的地方是建圖 可以大大節省空間複雜度 可以非常簡單實現鄰接表的效果
如果採用正常的數組 則實現鄰接矩陣 空間複雜度高 例如有10000個點,用數組則需要10000*10000的空間
如果使用vector
*/
//上面聲明瞭全局遍歷 vector<int> mp[10005]
for (int i = 0; i < 100; i++)
{
int a = random(), b = random();
mp[a].push_back(b);
mp[b].push_back(a); //雙向邊則需要反向添加
}
//這樣就利用vector很簡單的實現了鄰接表的效果 mp[1] vector 裏所存的就是 與點1相連的所有點 比如利用這個實現簡單的dfs遍歷圖
memset(vis, 0, sizeof(vis));
dfs(1); //從點1出發dfs遍歷圖
}
bool vis[10005]; //標記某個點是否經過過 dfs遍歷前初始化
void dfs(int x)
{
vis[x] = 1;
printf("%d\n", x);
for (int i = 0; i < mp[x].size(); i++) //遍歷這個點相連的所有點
{
if (vis[mp[x][i]] == true)
{
continue;
}
dfs(mp[x][i]);
}
}