Pregunta

¿Cuál es la forma más eficiente de la eliminación de una 'nueva línea' de un std :: string?

¿Fue útil?

Solución

#include <algorithm>
#include <string>

std::string str;

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());

El comportamiento de std :: remove puede no ser bastante lo que se espera. Ver una explicación de la misma aquí .

Otros consejos

Si se espera que la nueva línea para estar en la final de la cadena, a continuación:

if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}

Si la cadena puede contener muchos saltos de línea en cualquier lugar de la cadena:

std::string::size_type i = 0;
while (i < s.length()) {
    i = s.find('\n', i);
    if (i == std::string:npos) {
        break;
    }
    s.erase(i);
}

Se debe utilizar la borrado-remove idioma , en busca de '\n'. Esto funcionará para cualquier recipiente secuencia estándar; no sólo string.

Aquí está uno para DOS o Unix nueva línea:

    void chomp( string &s)
    {
            int pos;
            if((pos=s.find('\n')) != string::npos)
                    s.erase(pos);
    }
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());

Elimina el código de todos las nuevas líneas de la str cadena.

O (N) aplicación sirve mejor sin comentarios sobre el SO y por los comentarios en la producción.

unsigned shift=0;
for (unsigned i=0; i<length(str); ++i){
    if (str[i] == '\n') {
        ++shift;
    }else{
        str[i-shift] = str[i];
    }
}
str.resize(str.length() - shift);

Otra forma de hacerlo en el bucle for

void rm_nl(string &s) {
    for (int p = s.find("\n"); p != (int) string::npos; p = s.find("\n"))
    s.erase(p,1);
}

Uso:

string data = "\naaa\nbbb\nccc\nddd\n";
rm_nl(data); 
cout << data; // data = aaabbbcccddd

El uso std :: algoritmos. Esta pregunta tiene algunas sugerencias adecuadamente reutilizables quite los espacios de std :: string en C ++

 std::string some_str = SOME_VAL;
 if ( some_str.size() > 0 && some_str[some_str.length()-1] == '\n' ) 
  some_str.resize( some_str.length()-1 );

o (elimina varios saltos de línea al final)

some_str.resize( some_str.find_last_not_of(L"\n")+1 );

Si su lugar de la cadena que no se puede hacer mejor que O (n).

Y la única manera de hacerlo es buscar '\ n' en la cadena y borrarla.

for(int i=0;i<s.length();i++) if(s[i]=='\n') s.erase(s.begin()+i);

Para más saltos de línea que:

int n=0;
for(int i=0;i<s.length();i++){
    if(s[i]=='\n'){
        n++;//we increase the number of newlines we have found so far
    }else{
        s[i-n]=s[i];
    }
}
s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines

Se borran todos los saltos de línea una vez.

Acerca de respuesta 3 quitando sólo el último \ n fuera código de cadena:

if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}

¿La condición si no falla si la cadena está realmente vacío?

No es mejor hacer:

if (!s.empty())
{
    if (s[s.length()-1] == '\n')
        s.erase(s.length()-1);
}

Todas estas respuestas parecen un poco pesado para mí.

Si simplemente hacen quitar el '\ n' y se mueven hacia atrás todo lo demás un punto, usted es responsable de tener algunos caracteres chocaron en una forma de aspecto raro. Así que ¿por qué no hacer lo simple (y más eficiente) cosa:? Reemplazar todo '\ n es con espacios

for (int i = 0; i < str.length();i++) {
   if (str[i] == '\n') {
      str[i] = ' ';
   }
}

Puede haber maneras de mejorar la velocidad de este en los bordes, pero va a ser la forma más rápida de mover trozos enteros de la cuerda alrededor de la memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top