C++命名空间浅显了解及运用(信息学竞赛专用)

 当然也可以不看=>阅读我的文章前请务必先看此文章!

为了得到良好的阅读体验,请具备稍微完备的C++语法知识

注:只看蓝色加粗字加速阅读,红色加粗为误区

目录

引言

命名空间的创建

命名空间的内容

命名空间的引用

如何命名

写在最后


引言

在做题过程中,经常出现变量名重复的问题,比如如下代码中第9行的head[]数组和第17行的head变量,两者冲突,导致编译错误,以至于出现headd,hhead,hed等莫名其妙的变量名出现,导致代码写到后面已经将head和headd搞混,连代码都看不懂了

struct node
{
    int v, nxt;
};
node a[N + 5];
int head[N + 5], cnt = 0;
void add(int x, int y)
{
    a[++cnt].v = y;
    a[cnt].nxt = head[x];
    head[x] = cnt;
    return ;
}
int que[N + 5], head = 1, tail = 1;

那么,这篇文章将会介绍一个方法使得能够避免这种情况的出现

那就是——命名空间

命名空间的创建

#include<bits/stdc++.h>
using namespace std;
namespace SPACE1
{
    int a, b, c;
}
int a, b, c;
int main()
{
    //do something
    return 0;
}

在以上代码中,创建了一个名字为SPACE1的命名空间,并在其中定义了a,b,c三个变量,并且与全局变量a,b,c不冲突

命名空间的内容

不拘泥于定义变量, 还可以定义函数,定义结构体,在全局里能定义的东西命名空间里基本上都能定义,以下定义了一个名字为SPACE的命名空间

namespace SPACE
{
    int a, b;
    struct node
    {
        int v, nxt;
    };
    node c;
    void give(int v, int nxt)
    {
        c.v = v;
        c.nxt= nxt;
    }
    int getans()
    {
        int ans;
        //do something
        return ans;
    }
}

注意:在命名空间中定义的全局变量依然初始化为0,而在命名空间中定义的局部变量依然是随机数

namespace SPACE{
    int a;
    void work(){
        int b;
    }
    int main(){
        int c;
    }
}

其中变量a是全局变量,初始化为0,而在函数中的局部变量b和c不一定是0

命名空间的引用

非常简单,在其他地方要引用时,用"空间名称"+"::"+"全局变量/函数/结构体/...",比如下面这个代码

namespace SPACE
{
    int a;
    struct node{  int a, b;  };
    int work(){  /*do something*/ }
}
int main()
{
    SPACE::a = 100;
    cout << SPACE::A << endl; //输出100
    int ans = SPACE::work();
    SPACE::node a;
    a.a = 1, a.b = 2;
}

如何命名

在前面的讲解中,我的空间名字都是SPACE,但是在真正做题的时候你还要去特意的拼这个单词,所以不推荐写成这种工程风格的代码,代码长度一般的话,用一个具有代表性的大写字母来命名就可以了,举个栗子

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n, m;
namespace E
{
    struct node
    {
        int v, nxt;
    };
    vector<node> a(1);
    int head[N + 5], cnt = 0;
    void add(int x, int y)
    {
        a.push_back(y, head[x]);
        head[x] = ++cnt;
        return ;
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        E::add(x, y);
    }
    //do something
    return 0;
}

以上代码实现了建立n点m边的有向图,利用链式前向星存图,存图联想到边,边的英文edge,取它的首字母大写作为该命名空间的名字,注意最好要大写,不然和一些变量碰上 

写在最后

以上就是命名空间的主要用法,其实还有很多其他用法如命名空间的嵌套,命名空间的展开,但是在信息学竞赛中真的不需要这些,命名空间在我眼里看来就是防止重名,你又把他展开,那不还是重名了吗?所以这些我都没讲,赛场上这些就够了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值