Se encontró un problema importante. Si usa una variable temporal para ingresar repetidamente y luego crear un par clave-valor, solo puede usar cin >> en lugar de 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;
}
para resumir
Esencialmente la diferencia entre citar y direccionar
Se puede entender que cin no necesita la dirección de temp. Le dará a temp un alias y asignará una nueva memoria, de modo que cada par clave-valor corresponda al nuevo valor. El par clave-valor es esencialmente la correspondencia entre la dirección y dirección., La clave es que a la dirección de la clave se le debe asignar una nueva, y el valor se redistribuirá, por lo que siempre que la clave corresponda a la nueva dirección, no puede ser incorrecta
Y scanf, cambia directamente la dirección original, la dirección siempre es una, lo que da como resultado que la dirección clave en el par clave-valor no haya cambiado, pero los datos entrantes hayan estado cambiando y el valor de la etiqueta sea siempre el mismo, lo que provocó un error
Entonces, si puede usar cin, especialmente la asignación repetida de variables temporales, use cin
Simplemente comprenda que cin puede realmente darse cuenta de la relación valor-valor sin involucrar el problema de la superposición de direcciones
Inglés
problema
Preste atención a los detalles de estos compiladores