En the other topic estaba tratando de resolver el problema this. El problema era eliminar los caracteres duplicados de std::string
.¿Qué pasa con `std :: set`?
std::string s= "saaangeetha";
Dado que el orden no era importante, así que ordenan s
primero, y luego se usa std::unique
y, finalmente, cambiar de tamaño para obtener the desired result:
aeghnst
Eso es correcto!
Ahora quiero hacer lo mismo, pero al mismo tiempo quiero que el orden de los caracteres esté intacto. Medios, quiero esta salida:
sangeth
Así que escribió this:
template<typename T>
struct is_repeated
{
std::set<T> unique;
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
s.erase(std::remove_if(s.begin(), s.end(), is_repeated<char>()), s.end());
std::cout << s ;
}
que da a esta salida:
saangeth
Es decir, a
se repite, aunque otras repeticiones desaparecido. ¿Qué está mal con el código?
De todos modos yo change my code un poco: (ver el comentario)
template<typename T>
struct is_repeated
{
std::set<T> & unique; //made reference!
is_repeated(std::set<T> &s) : unique(s) {} //added line!
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
std::set<char> set; //added line!
s.erase(std::remove_if(s.begin(),s.end(),is_repeated<char>(set)),s.end());
std::cout << s ;
}
Salida:
sangeth
problema ha ido!
¿Qué pasa con la primera solución?
Además, si no hago la variable de miembro unique
tipo de referencia, entonces the problem doesn't go.
¿Qué ocurre con std::set
o is_repeated
functor? ¿Dónde exactamente está el problema?
También observo que si el functor is_repeated
se copia en alguna parte, entonces también se copiará cada miembro. ¡No veo el problema aquí!
Como acotación al margen, la clasificación de los datos es O (N log N). Hay un algoritmo mucho más eficiente para hacer esto. Haz un pase lineal de la cuerda, contando las ocurrencias de cada personaje. Haga una segunda pasada de la cadena y solo salga si la cuenta es 1. Esto es O (N). –
No necesita dos pases. Simplemente haga una matriz de bool y compruebe si bEncuentra [c] == verdadero si es falso, añádalo a la cadena de resultados y establezca bFound [c] = verdadero. De esta forma puedes construir un filtro y usarlo en una sola pasada. –
@Jeff: O use un conjunto desordenado en lugar de un conjunto. – kennytm