pat-1124
作者:互联网
发现一个重要问题,如果用一个临时变量重复输入,再建立键值对,只能用cin>>,不能用scanf
#include<iostream>
#include<map>
using namespace std;
map<string,int> pos;
int main(){
int m,n,s;
scanf("%d %d %d",&m,&n,&s);
for(int i=1;i<=m;i++){
string temp;//每一次都要重新声明,重新声明时,一般变量名不变,地址也不变;
cin>>temp;// 所以最好使用cin这就是一个值传递,会copy一个新地址,实现除去地址的值传递
int flag=0;
if(s>m){if(i==1) printf("Keep going...\n");
}
else if(i==s){//更新s
if(pos[temp]==0){//本质是地址建立键值对
pos[temp]=1;
printf("%s\n",temp.c_str());
flag=1;
s=s+n;
}
if(flag==1) continue;
if(i==s)s=s+1;
}
}
return 0;
}
总结
本质上是引用与取地址的区别
可以这么理解,cin不需要temp的地址,他会给temp取一个别名,分配一个新内存,这样每次键值对,就相当于与新值进行对应,键值对本质也是地址与地址的对应,关键是键的地址要分配新的,值会再分配,所以只要键对应的是新地址,就错不了
而scanf,直接在原地址上改变,地址始终是一个,导致键值对里的键的地址没变过,传入的数据却一直在变,而且标记值始终不变导致错误
所以能使用cin尤其是临时变量重复赋值,就使用cin
简单理解cin 能真正实现 值对值,而不涉及地址重合的问题
英语
问题
注意这些编译器的细节问题
标签:pat,temp,int,1124,cin,pos,地址,键值 来源: https://blog.csdn.net/m0_45359314/article/details/113076899