Eliminar espacios de std :: string en C ++

¿Cuál es la forma preferida de eliminar espacios de una cadena en C ++? Podría recorrer todos los personajes y construir una nueva cuerda, pero ¿hay una mejor manera?

Lo mejor que puedes hacer es usar el algoritmo remove_if y isspace:

 remove_if(str.begin(), str.end(), isspace); 

Ahora el algoritmo en sí no puede cambiar el contenedor (solo modifica los valores), por lo que en realidad mezcla los valores y devuelve un puntero al lugar donde debería estar ahora el extremo. Entonces, debemos llamar a string :: erase para modificar realmente la longitud del contenedor:

 str.erase(remove_if(str.begin(), str.end(), isspace), str.end()); 

También debemos tener en cuenta que remove_if hará como máximo una copia de los datos. Aquí hay una implementación de ejemplo:

 template T remove_if(T beg, T end, P pred) { T dest = beg; for (T itr = beg;itr != end; ++itr) if (!pred(*itr)) *(dest++) = *itr; return dest; } 
 std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' '); str.erase(end_pos, str.end()); 

De gamedev

 string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end()); 

¿Puedes usar Boost String Algo? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573

 erase_all(str, " "); 

Para recortar, use algoritmos de cadena de refuerzo :

 #include  using namespace std; using namespace boost; // ... string str1(" hello world! "); trim(str1); // str1 == "hello world!" 

Hola, puedes hacer algo como eso. Esta función borra todos los espacios.

 string delSpaces(string &str) { str.erase(std::remove(str.begin(), str.end(), ' '), str.end()); return str; } 

Hice otra función, que elimina todos los espacios innecesarios.

 string delUnnecessary(string &str) { int size = str.length(); for(int j = 0; j<=size; j++) { for(int i = 0; i <=j; i++) { if(str[i] == ' ' && str[i+1] == ' ') { str.erase(str.begin() + i); } else if(str[0]== ' ') { str.erase(str.begin()); } else if(str[i] == '\0' && str[i-1]== ' ') { str.erase(str.end() - 1); } } } return str; } 

Puede usar esta solución para eliminar un char:

 #include  #include  using namespace std; str.erase(remove(str.begin(), str.end(), char_to_remove), str.end()); 
 string replaceinString(std::string str, std::string tofind, std::string toreplace) { size_t position = 0; for ( position = str.find(tofind); position != std::string::npos; position = str.find(tofind,position) ) { str.replace(position ,1, toreplace); } return(str); } 

usarlo:

 string replace = replaceinString(thisstring, " ", "%20"); string replace2 = replaceinString(thisstring, " ", "-"); string replace3 = replaceinString(thisstring, " ", "+"); 

Si quieres hacer esto con una macro fácil, aquí hay una:

 #define REMOVE_SPACES(x) x.erase(std::remove(x.begin(), x.end(), ' '), x.end()) 

Esto supone que ha hecho #include por supuesto.

Llámalo así:

 std::string sName = " Example Name "; REMOVE_SPACES(sName); printf("%s",sName.c_str()); // requires #include  

Utilicé el siguiente trabajo por mucho tiempo, sin estar seguro de su complejidad.

s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return (f==' '||s==' ');}),s.end());

cuando quieras eliminar el carácter ' ' y algunos por ejemplo - usa

s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return ((f==' '||s==' ')||(f=='-'||s=='-'));}),s.end());

del mismo modo solo aumenta el || si la cantidad de caracteres que quieres eliminar no es 1

pero como lo mencionaron otros, el borrado de borrar idioma también parece estar bien.

 string removespace(string str) { int m = str.length(); int i=0; while(i 

Me temo que es la mejor solución que se me ocurre. Pero puede usar reserve () para preasignar la memoria mínima requerida por adelantado para acelerar un poco las cosas. Terminará con una nueva cadena que probablemente será más corta, pero que ocupará la misma cantidad de memoria, pero evitará las reasignaciones.

EDITAR: Dependiendo de su situación, esto puede incurrir en menos gastos generales que los caracteres de confusión alrededor.

Debe probar diferentes enfoques y ver qué es lo mejor para usted: es posible que no tenga problemas de rendimiento.