boost::split deja tokens vacíos al principio y al final de la cadena. ¿Es este el comportamiento deseado?

Como no pude encontrar nada sobre esto en el documentación, pensé preguntarlo aquí. Tengo el siguiente programa (C++ 11):

#include <iostream> 
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

int main () {
    string tmp = " #tag #tag1#tag2  #tag3 ####tag4   ";
    list<iterator_range<string::iterator> > matches;
    split( matches, tmp, is_any_of("\t #"), token_compress_on );

    for( auto match: matches ) {
            cout << "'" << match << "'\n";
    }
}

El resultado es:

''
'tag'
'tag1'
'tag2'
'tag3'
'tag4'
''

Hubiera pensado que el token_compress_on La opción elimina todos los tokens vacíos. La solución es, por ejemplo, utilizar boost::trim_if. Sin embargo, me preguntaba si este es el comportamiento deseado de boost::split, y por qué sucede esto.

(g ++ 4.6.3, impulso 1.48)

preguntado el 03 de mayo de 12 a las 19:05

3 Respuestas

El comportamiento es intencional, porque podría recrear la cadena (completa con espacios iniciales y finales) a partir de la versión dividida. Boost no sabe si ese espacio en blanco es significativo o no para usted (podría serlo, ya que algunos formatos de archivo, por ejemplo, podrían forzar espacios iniciales/recuentos de espacios específicos).

Debes trim_if or trim como lo está si necesita eliminar los espacios iniciales/posteriores.

contestado el 03 de mayo de 12 a las 19:05

Tal vez no entiendo el punto, pero ¿cómo puedo recrear " #tag #tag1#tag2 #tag3 ####tag4 " de los tokens "", "tag", "tag1", "tag2", "tag3" , "etiqueta4", ""? - fdlm

@fdlm Eso sería específico para el formato de su cadena. el comportamiento de boost::split es bastante general, pero a algunos usuarios les puede interesar conservar los caracteres finales/iniciales que, de lo contrario, se eliminarían dividiéndolos. Básicamente, si necesita que esos caracteres desaparezcan, debe ser explícito y componer funciones juntas que hagan lo que espera. - 逆 さ ま

If eCompress el argumento se establece en token_compress_on, los separadores adyacentes se fusionan. De lo contrario, cada dos separadores delimitan un token.

Aquí

No elimina los tokens, solo los fusiona.

Respondido 10 Abr '13, 19:04

boost::split siempre vuelve n + 1 fichas donde n es el número de separadores en la cadena de entrada. Así que no se sorprenda cuando devuelva 1 token cuando le pase una cadena vacía.

La razón detrás de esto es bastante simple. Imagina que estás analizando un archivo CSV. Debe obtener exactamente la misma cantidad de elementos, independientemente de si el último token está vacío o no.

Es mucho más fácil eliminar las fichas vacías que adivinar si se suponía que debían estar en el resultado o no. Crédito

Este comportamiento es similar a python

>>> len("".split(','))
1

Respondido el 12 de enero de 17 a las 01:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.