C++ stl vector

#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]);
    }
}

 

发布了147 篇原创文章 · 获赞 14 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章