¿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?Eliminar espacios de std :: string en C++
Respuesta
Lo mejor que puede hacer es utilizar el algoritmo remove_if
y isspace:
remove_if(str.begin(), str.end(), isspace);
Ahora el algoritmo en sí no puede cambiar el contenedor (sólo modificar los valores), por lo que en realidad baraja los valores alrededor y devuelve un puntero hacia donde debe estar el final ahora. Así que tenemos que llamar a string :: Borrar para modificar realmente la longitud del contenedor:
str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
También debemos señalar que remove_if hará como máximo una copia de los datos. Aquí hay una implementación de ejemplo:
template<typename T, typename P>
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;
}
De gamedev
string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end());
Esto no se compilará en implementaciones que se ajusten a las normas debido a las sobrecargas de std :: isspace que toman localizaciones. Tendrá que usar :: isspace o realizar algunas maquinaciones ilegibles con std :: bind2nd. ¿No es hermoso el código genérico? – Bklyn
std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());
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 que se mezclan.
Debe probar diferentes enfoques y ver qué es lo mejor para usted: es posible que no tenga ningún problema de rendimiento.
remove_if realiza como máximo una copia de cada valor. Entonces realmente no hay mucho sobrecarga relativa a lo que se necesita hacer. –
¿Se puede usar Boost String Algo? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573
erase_all(str, " ");
Es más lento que el 'remove_if (str.begin(), str.end(), isspace);' que mencionó Matt Price. No sé por qué. En realidad, todas las cosas de impulso, que tienen alternativas de STL, son más lentas que las gcc correspondientes (todas las que probé). ¡Algunos de ellos son inmensamente más lentos! (hasta 5 veces en inserciones de mapa no ordenado) Tal vez sea debido a la memoria caché de la CPU del entorno compartido o algo así. – Etherealone
Para recortar, utilice boost string algorithms:
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;
// ...
string str1(" hello world! ");
trim(str1); // str1 == "hello world!"
-1: esto recorta; no elimina todos los espacios en blanco. –
Hola, se puede hacer algo por el estilo. 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;
}
delgado y directo al grano, gracias. – Felipe
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, " ", "+");
gracias, esto funcionó como un encanto para mí. –
Se puede utilizar esta solución para la eliminación de un char:
#include <algorithm>
#include <string>
using namespace std;
str.erase(remove(str.begin(), str.end(), char_to_remove), str.end());
#include < string.h > usando namespace std; – slackmart
Esta solución es correcta para mí. El de arriba no es. –
string removespace(string str)
{
int m = str.length();
int i=0;
while(i<m)
{
while(str[i] == 32)
str.erase(i,1);
i++;
}
}
Generalmente, se prefiere agregar una breve explicación a las respuestas del código. – arcyqwerty
@test - 'length()' devuelve un 'size_t', no un' int'. 'erase()' toma un 'size_type', no un' int'. La función probablemente fallará si se encuentran dos espacios consecutivos ya que el índice siempre se incrementa. Si se elimina un espacio, entonces el ciclo leerá más allá de los límites de la cadena. Probablemente deberías eliminar esta respuesta ya que necesita mucha ayuda. – jww
Si desea hacerlo con una macro fácil , aquí hay uno:
#define REMOVE_SPACES(x) x.erase(std::remove(x.begin(), x.end(), ' '), x.end())
Esto supone que ha hecho #include <string>
por supuesto.
de llamadas que de este modo:
std::string sName = " Example Name ";
REMOVE_SPACES(sName);
printf("%s",sName.c_str()); // requires #include <stdio.h>
que utiliza el trabajo de abajo por mucho tiempo - no está seguro acerca de su complejidad.
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return (f==' '||s==' ');}),s.end());
cuando se quiere eliminar el carácter ' '
y algunos por ejemplo -
uso
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return ((f==' '||s==' ')||(f=='-'||s=='-'));}),s.end());
asimismo simplemente aumentar el ||
si el número de caracteres ¿Quieres eliminar no es 1
pero como se mencionó por otros, el borrado borrar idioma también parece estar bien.
- 1. Cómo eliminar acentos y tilde en C++ std :: string
- 2. Obtenga bytes de std :: string en C++
- 3. C++ std :: string to boolean
- 4. Cython C++ y std :: string
- 5. std :: string :: longitud() vs. std :: string :: size()
- 6. Convertir flotador para std :: string en C++
- 7. Unicode y std :: string en C++
- 8. C++/CLI La conversión de Sistema :: string^std :: string
- 9. Cómo convertir System :: String^en std :: string?
- 10. SWIG: Cómo ajustar std :: string & (std :: string pasado por referencia)
- 11. C++ .NET convert System :: String to std :: string
- 12. C++ std :: string y NULL const char *
- 13. ¿Están C++ std :: map <string, string> ordenados?
- 14. Rendimiento std :: strstr vs std :: string :: encontrar
- 15. std :: vector <std::string> crash
- 16. Comparación de Literal de carácter a Std :: String en C++
- 17. C# equivalente de C++ find_first_not_of std :: string y find_last_not_of
- 18. Convierte uint64_t en std :: string
- 19. Convertir std :: string en QString
- 20. Definir std :: string en C++ sin caracteres de escape
- 21. std :: string vs. char *
- 22. inicializar std :: string de char * sin copia
- 23. std :: string :: reemplazar implementación estándar?
- 24. operator std :: string() const?
- 25. Lectura directamente de std :: istream en std :: string
- 26. std :: string :: assign() causa segfault
- 27. Will std :: string siempre tendrá terminación nula en C++ 11?
- 28. Cómo convertir std :: string a LPCWSTR en C++ (Unicode)
- 29. Cómo convertir caracteres sin signo * a std :: string en C++?
- 30. Lea todo el archivo ASCII en C++ std :: string
Debido a que 'isspace' tiene sobrecargas, es probable que necesite calificar el código genérico para usar :: isspace (la implementación C que no toma una configuración regional) o ser recibido con errores crípticos de creación de instancias de plantilla. – Bklyn
Todos - tenga cuidado con el método anterior (Las dos líneas simples, no la versión con plantilla, aunque puede tener el mismo problema). Lo usé en un proyecto sin darme cuenta de que no siempre es correcto. Por ejemplo, si le pasa la cadena "1 + 1", devuelve "1 + 11". Cambié al método de @rupello a continuación y funcionó bien para este caso. Feliz codificación! – JoeB
@Joe La respuesta menciona explícitamente que debe llamar a 'borrar' después. Eso devolverá el resultado correcto. –