2011-04-20 26 views
10

Actualmente estoy usando el paquete muy inteligente boost::const_string hasta http://libcxx.llvm.org/ está disponible pre-empaquetados en Ubuntu o GCC hará su __versa_string (en la cabecera ext/vstring.h) su implementación cadena predeterminada. libcxx's std::string así como __versa_string usa _small-string optimization (SSO) por defecto. Sin embargo, falta compatibilidad con la salida para un std::ostream. El códigoSoporte para const_string en el operador std :: ostream <<

#include <iostream> 
#include <boost/const_string.hpp> 

const_string<char> x; 
std::cout << x << endl; 

no funciona a menos forzamos x en un c-cadena a través de c_str() que se convierte en

std::cout << x.c_str() << endl; 

que compila y funciona como se esperaba. He añadido la siguiente línea al const_string.hpp

template <typename T> 
inline std::ostream & operator << (std::ostream & os, const boost::const_string<T> & a) 
{ 
    return os.write(a.data(), a.size()); 
} 

Esto debería mejorar el rendimiento en x.c_str()size() porque ya es conocido y no necesita ser calculado mediante la búsqueda de NULL como en c_str(). Trabajo para mí, pero no estoy seguro si funciona en todos los casos. ¿Me he perdido algo?

+3

Eso depende del comportamiento que desee para los caracteres no imprimibles (especialmente '\ 0'), supongo. Creo que (!) El comportamiento predeterminado para las cadenas normales es truncar después de caracteres nulos. Su implementación probablemente no hará eso. Por cierto, +1 por hacerme consciente de 'boost :: const_string'. –

+3

Creo que este es un tipo de compensación. Por lo que veo, su código no refleja la configuración del manipulador como 'std :: setw'. Si no utiliza esos manipuladores para 'const_string', , creo que su código tiene un uso propio. –

Respuesta

3

¿He perdido algo?

Sí, solo incluya const_string/io.hpp. Sin embargo, todo lo que hace es:

return o << std::basic_string<char_type, traits_type>(s.data(), s.size()); 
+0

¿Es eso tan rápido como mi alternativa? –

+1

@ Nordlöw: muy probablemente, p. Ej. construye una 'basic_string' temporal, pero, una vez más, no tiene que lidiar con locales et al. De todos modos, lo mediría si realmente importa en su aplicación. –

2

Parece que esto podría tener implicaciones basadas en la configuración regional y/o las facetas aplicadas a la secuencia de cadenas, en lugar de simplemente escribir los datos directos mientras lo hace.

Sería menos eficiente, pero ¿qué tal si creamos una std :: string de const_string y usamos << para insertar eso en la secuencia?

+0

Gracias por sus comentarios. ¿Cómo apoyo la configuración regional entonces? –

1

No (no te has perdido nada, afaik). Si su objetivo no es copiar el contenido, str.data() es el camino a seguir.

Cuestiones relacionadas