一、定义
结构体可以将任意多不同或者相同的数据类型整合到一个数据类型当中,包括整型、浮点型、字符、数组、指针和结构体自身等等。它可以看作是一种自定义类型,在后续使用时当作如 i n t int int 这样的基本数据类型来使用。一个结构体变量包含定义中所有的变量,每一个变量称为结构体的一个成员。
它的一般形式如下所示:
struct 名字
{
类型 变量名;
类型 变量名;
...
类型 变量名;
};
下面是一个普通的结构体的例子,在这个叫做 node 的结构体中包含了一些常见的数据类型,它有 6 6 6 个成员,其中有两个成员是数组。所以整个结构体总共包含了 204 204 204 个变量。
struct node
{
int a;
float b
double c;
string d;
int e[100];
int f[100];
};
二、赋值与使用
可以使用多种方式定义结构体变量,把它当作一种基本数据类型来使用,名字叫做 node。
-
可以在分号前面定义,作为全局变量:
struct node { ll x,y; }a;
-
也可以像其他的类型一样定义全局变量和局部变量:
struct New { ll x,y; }; New p,q; int main() { New temp; return 0; }
-
结构体也可以定义为数组,这样每一个元素都是一个结构体变量,包含所有成员:
struct ano { ll x,y; }b[maxn];
对结构体进行赋值的方式也有很多种:
- 可以用大括号的方式对每一个域进行赋值
- 也可以使用
.
展开每一个域来分别赋值 - 同样两个相同类型的变量可以相互赋值
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
struct node
{
int a;
float b;
double c;
}z[100];
node temp;
int main()
{
node x,y={2,4.0,5.2};
x.a=1;x.b=2.0;x.c=3.2;
cout<<x.a<<" "<<x.b<<" "<<x.c<<endl;
cout<<y.a<<" "<<y.b<<" "<<y.c<<endl;
temp=x;
return 0;
}
三、使用sort
排序
1.cmp
函数
对于结构体的排序我们需要使用到cmp
函数来帮助我们定义相互之间的大小关系。
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int a;
float b;
double c;
}z[100];
bool cmp(node x,node y)
{
if(x.a != y.a)
return x.a < y.a;//以a域从小到大排序
else if(x.b != y.b)
return x.b < y.b;//以b域从小到大排序
return x.c<y.c;//以c域从小到大排序
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>z[i].a>>z[i].b>>z[i].c;
sort(z+1,z+1+n,cmp);//对数组下标1到n进行排序
for(int i=1;i<=n;i++)
cout<<z[i].a<<" "<<z[i].b<<" "<<z[i].c<<endl;
return 0;
}
使用cmp
函数的优势在于,如果需要对一个结构体进行多种方式的排序,只需要多写几个不同的cmp
函数即可。
2.重载运算符
除此以外我们还可以使用重载<
的方式来规定结构体变量的大小关系,因为sort
函数的实现就是依靠<
。重载运算符在一些
S
T
L
STL
STL的数据结构中使用得非常频繁。
重载运算符之后依然可以使用cmp
函数,两者并不冲突。
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int a;
float b;
double c;
bool operator<(const node &x)const
{
if(a!=x.a)
return a<x.a;
else if(b!=x.b)
return b<x.b;
return c<x.c;
}
}z[100];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>z[i].a>>z[i].b>>z[i].c;
sort(z+1,z+1+n);
for(int i=1;i<=n;i++)
cout<<z[i].a<<" "<<z[i].b<<" "<<z[i].c<<endl;
return 0;
}