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 能真正实现   值对值,而不涉及地址重合的问题

英语 

问题

注意这些编译器的细节问题

 

猜你喜欢

转载自blog.csdn.net/m0_45359314/article/details/113076899