Ответ 1
Я что-то пропустил?
Да, просто включите const_string/io.hpp
. Все, что он делает, это:
return o << std::basic_string<char_type, traits_type>(s.data(), s.size());
В настоящее время я использую очень умный пакет boost::const_string
до http://libcxx.llvm.org/ доступен, предварительно упакованный в Ubuntu или GCC, делает его __versa_string
(в заголовке ext/vstring.h
) своей реализацией строки по умолчанию. libcxx std::string
, а __versa_string
по умолчанию использует оптимизацию _small-string (SSO). Однако поддержка по умолчанию для вывода на std::ostream
отсутствует. Код
#include <iostream>
#include <boost/const_string.hpp>
const_string<char> x;
std::cout << x << endl;
не работает, если мы не введем x
в c-строку через c_str()
, которая становится
std::cout << x.c_str() << endl;
который компилируется и работает так, как ожидалось. Я добавил следующую строку в 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());
}
Это должно повысить производительность по сравнению с x.c_str()
, потому что size()
уже известен и не нуждается в вычислении путем поиска NULL
, как в c_str()
. Я работаю для меня, но я не уверен, работает ли он во всех случаях. Я что-то пропустил?
Я что-то пропустил?
Да, просто включите const_string/io.hpp
. Все, что он делает, это:
return o << std::basic_string<char_type, traits_type>(s.data(), s.size());
Похоже, что это может иметь последствия, основанные на локали и/или гранях, применяемых к потоку для строк, и просто записывать прямые данные, как вы это делаете.
Это будет менее результативно, но как насчет создания std::string из const_string и использования <<
для вставки этого в поток?
Нет (вы ничего не пропустили, afaik). Если ваша цель - не копировать содержимое, str.data() - это путь.