当然也可以不看=>阅读我的文章前请务必先看此文章!
为了得到良好的阅读体验,请具备稍微完备的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,取它的首字母大写作为该命名空间的名字,注意最好要大写,不然和一些变量碰上
写在最后
以上就是命名空间的主要用法,其实还有很多其他用法如命名空间的嵌套,命名空间的展开,但是在信息学竞赛中真的不需要这些,命名空间在我眼里看来就是防止重名,你又把他展开,那不还是重名了吗?所以这些我都没讲,赛场上这些就够了