听作者讲骚话
这是我写完结构体之后的故事了…
后来有一位比霍金还sao的很年轻漂亮苗条老女人 来问我说碰到结构体包含二维数组怎么办
(⊙o⊙)…
其实排序的时候,sort交换元素使用的就是类似swap的东西,会交换对象的所有地址。
因此你可以把二维三维四维五六七八维都往结构体里扔,这是没有关系的。
如果要在一个结构体里扔很多字符串,不建议使用C++类字符串
就是这个东西:
string a[maxm];
string ss;
这种字符串用起来比较方便,但是很慢(或者说我们使用这个简直是高射炮打蚊子),string的本质是C++ STL库中封装的一个容器并且捆绑了很多函数,我们OI中使用string仅仅是为了存字符串,而不像真正的程序猿们一样要处理很多诡异的东西。
目的纯粹,所以使用C类字符串:
char s[maxm];
这类字符串本质就是字符数组,结尾默认带上’\0’的那种。也是可以使用字符串处理的基本函数。
字符串读入输出小全
以下内容都是C类字符串[手动滑稽]
注: < Space > 和 < CR > 带有此标记指忽略空格或回车的意思
扯一下string吧
对于string ss下面给出一些合法的输入输出关系:
Input | Output |
---|---|
cin>>ss | cout<<ss |
cin>>ss | printf("%s",ss.c_str()) |
scanf("%s",ss.c_str()) | printf("%s",ss.c_str()) |
对于char a[100] 下面给出一些合法的输入输出关系:
其中puts输出会自动换行
Input | Output |
---|---|
cin>>a | cout<<a |
cin>>a | printf("%s",a) |
cin>>a | puts(a) < Space > |
scanf("%s",a) | printf("%s",a) |
scanf("%s",a) | cout<<a |
scanf("%s",a) | puts(a) < Space > |
cin.getline(a,sizeof(a)) < Space > | printf("%s",a) |
cin.getline(a,sizeof(a)) < Space > | cout<<a |
cin.getline(a,sizeof(a)) < Space > | puts(a) < Space > |
gets(a) < Space > | printf("%s",a) |
gets(a) < Space > | cout<<a |
gets(a) < Space > | puts(a) < Space > |
字符串捆绑排序
解释在上一回里都有,这里不再多说,以下是字符串和数字捆绑排序的代码:
上一回的传送门:[手动滑稽的运算符重载和捆绑排序]
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxm=1001;
int n,k;
struct node{
int num;
char a[maxm][maxm];
node(){num=0;memset(a,0,sizeof(a));return;}
bool operator < (const node &x)const{
if(num<x.num) return true;
return false;
}
}d[maxm];
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>d[i].num>>k;
for(int j=1;j<=k;j++){
cin>>d[i].a[j];
}
}
sort(d+1,d+n+1);
for(int i=1;i<=n;i++){
cout<<d[i].num<<" ";
}cout<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=5;j++){
puts(d[i].a[j]);
cout<<" ";
}cout<<endl;
}
return 0;
}