C++中vector 常见用法和技巧笔记(持续更新......)

1.vector二维数组

vector二维数组可以用两种方式来表示

  • vetcor嵌套vector,vector< vector<int> > vec[N],在使用嵌套时vector< vector<int>(注:此处要有空格,如果没有空格可能会因为有歧义报错,这里两个>形成右移符号)>
  • vector数组,vector<int> vec[N]

可以通过vec[i][j]来访问vector二维数组中的元素。

2.vector顺序插入

用顺序插入需要结合insert函数和lower_bound函数。首先简短介绍一下insert和lower_bound函数:

  • insert函数insert函数是vector容器的成员函数之一,用于在指定位置插入一个或多个元素。它接受两个迭代器参数,第一个参数指定了插入位置,第二个参数指定了要插入的元素。插入操作后,原来在插入位置及其后面的元素将被移动到新的位置,以便为新元素腾出空间。格式如:vec.insert(pos, value);
  • lower_bound函数lower_bound函数用于查找在有序序列中插入一个新元素时,新元素应该插入的位置。它返回一个迭代器,指向第一个大于或等于给定值的元素的位置。如果没有大于或等于给定值的元素,则返回指向容器末尾的迭代器。格式如:lower_bound(vec.begin(), vec.end(), value);

结合上述两个函数可以实现vector的顺序插入:

  1. 首先,使用lower_bound函数找到新元素应该插入的位置。例如:auto it = std::lower_bound(vec.begin(), vec.end(), value);
  2. 然后,利用insert函数在该位置插入新元素。例如:vec.insert(it, value);
  3. 综上,即可以通过vec.insert(lower_bound(vec.begin,vec.end(),value),value);来实现顺序插入

基于上述vector技巧1和2的例题应用,洛谷P5318 【深基18.例3】查找文献 在这里插入图片描述题解代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+3;
vector<int> g[N]; //vector二维数组存邻接点
int n,m;
int vis[N],vis1[N];
int zc;
void dfs(int x)
{
    vis[x]=1;
    cout<<x<<" ";
    for(int i=0;i<g[x].size();++i)
    {
        zc=g[x][i];
        if(vis[zc]==0)
        {
            dfs(zc);
        }
    }
}
void bfs(int x)
{
    queue<int> q;
    q.push(x);
    cout<<x<<" ";
    vis1[x]=1;
    while(q.size()!=0)
    {
        int qzc=q.front();
        for(int i=0;i<g[qzc].size();i++)
        {
            if(vis1[g[qzc][i]]==0)
            {
                q.push(g[qzc][i]);
                cout<<g[qzc][i]<<" ";
                vis1[g[qzc][i]]=1;
            }
        }
        q.pop();
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    int a,b;
    for(int i=1;i<=m;++i)
    {
        cin>>a>>b;
        g[a].insert(lower_bound(g[a].begin(),g[a].end(),b),b);
        //实现顺序插入,存每个点的邻接点
    }
    dfs(1);
    cout<<endl;
    bfs(1);
    return 0;
}

用vector二维数组来存每个顶点的邻接点,由于题中要求如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序),故在存邻接点的时候可以直接用顺序插入,当然也可以存完在用sort。

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值