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?
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'. –
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. –