Tengo un curioso problema que me esta mareando un poco, os explico:
Omito las funciones y cabeceras, se que funcionan y no me dan problemas, y aclaro un poco este follón de código.
Lo que hago, es capturar secuencias de enteros y filtrar solo los que aparecen en todas las líneas. Mi idea es capturar una linea y meterla en un mapa (Mapa A), las siguientes en el mapa "B".
Luego, itero el mapa "A" y compruebo si la llave del iterador existe en el mapa "B", y en caso de que no sea así, borro de A esa clave.
El caso es que el programa, tal y como está "revienta". Solo puedo asumir que tengo un iterador "loco" corriendo por ahi, pero no acabo de ver cual, porque veamos:
Tengo un iterador "it" que va a recorrer los valores del mapa A, y lo ubico en su primera casilla. Luego, compruebo con el iterador ITB si el valor de la llave de ese iterador existe en "B", si el valor devuelto es "B.end" entonces es que no está, por lo que borro ese contenido en "A".
Soy consciente desde luego, que desde el momento en que efectuo una operación de borrado, ese iterador deja de ser valido, por lo que lo devuelvo a su punto inicial, pero vamos... no se porque "explota"
Estoy pensando obviamente en no borrar nada, y usar el valor asociado a la clave (que es booleano) para marcarlo, y ya os diré como va la cosa, pero claro, el tema es que si quisiera borrar datos, me veo ante un código que falla, y no tengo claro porque.
A ver si alguien ve donde estoy metiendo la gamba
Por cierto, si hago eso que os he comentado, el programa funciona... os pongo el código entero por si alguien quiere aclararse un poco mas
Claro, el programa ahora va, pero sigo sin saber porque la versión anterior que borraba los elementos no repetidos no lo hace, y preferiría saber porque es eso, antes que pensar "buenooooo ahora funciona, no me preocupo mas"
Código [Seleccionar]
int main(){
string entrada;
map <int, bool> A;
map <int, bool> B;
getline (cin, entrada);
cout << entrada << endl;
A = separa (entrada);
while (getline (cin, entrada)){
B = separa (entrada);
map<int, bool>::iterator it = A.begin();
for (; it != A.end(); it++){
map<int, bool>::iterator itb = B.find(it->first);
if (itb == B.end()){
A.erase(it->first);
map<int, bool>::iterator it = A.begin();
}
}
muestra (A);
}
}
Omito las funciones y cabeceras, se que funcionan y no me dan problemas, y aclaro un poco este follón de código.
Lo que hago, es capturar secuencias de enteros y filtrar solo los que aparecen en todas las líneas. Mi idea es capturar una linea y meterla en un mapa (Mapa A), las siguientes en el mapa "B".
Luego, itero el mapa "A" y compruebo si la llave del iterador existe en el mapa "B", y en caso de que no sea así, borro de A esa clave.
El caso es que el programa, tal y como está "revienta". Solo puedo asumir que tengo un iterador "loco" corriendo por ahi, pero no acabo de ver cual, porque veamos:
Tengo un iterador "it" que va a recorrer los valores del mapa A, y lo ubico en su primera casilla. Luego, compruebo con el iterador ITB si el valor de la llave de ese iterador existe en "B", si el valor devuelto es "B.end" entonces es que no está, por lo que borro ese contenido en "A".
Soy consciente desde luego, que desde el momento en que efectuo una operación de borrado, ese iterador deja de ser valido, por lo que lo devuelvo a su punto inicial, pero vamos... no se porque "explota"
Estoy pensando obviamente en no borrar nada, y usar el valor asociado a la clave (que es booleano) para marcarlo, y ya os diré como va la cosa, pero claro, el tema es que si quisiera borrar datos, me veo ante un código que falla, y no tengo claro porque.
A ver si alguien ve donde estoy metiendo la gamba
Por cierto, si hago eso que os he comentado, el programa funciona... os pongo el código entero por si alguien quiere aclararse un poco mas
Código [Seleccionar]
#include <iostream>
#include <sstream>
#include <map>
using namespace std;
map <int, bool> separa (string& s){
istringstream S (s);
map<int, bool> ret;
int n;
while (S >> n){
ret[n] = false;
}
return ret;
}
void muestra (const map<int, bool>& m){
map<int, bool>::const_iterator itm = m.begin();
for (; itm != m.end(); itm++){
if (itm->second == false) cout << itm->first << ' ';
}
cout << endl;
}
int main(){
string entrada;
map <int, bool> A;
map <int, bool> B;
getline (cin, entrada);
cout << entrada << endl;
A = separa (entrada);
while (getline (cin, entrada)){
B = separa (entrada);
map<int, bool>::iterator it = A.begin();
for (; it != A.end(); it++){
map<int, bool>::iterator itb = B.find(it->first);
if (itb == B.end()){
it->second = true;
}
}
muestra (A);
}
}
Claro, el programa ahora va, pero sigo sin saber porque la versión anterior que borraba los elementos no repetidos no lo hace, y preferiría saber porque es eso, antes que pensar "buenooooo ahora funciona, no me preocupo mas"