我目前正在使用非常聪明的软件包boost::const_string
,直到http://libcxx.llvm.org/预先打包在Ubuntu或GCC上,使其__versa_string
(在标头ext/vstring.h
中)成为默认软件包字符串实现。 libcxx的std::string
以及__versa_string
默认使用_small-string optimization(SSO)。但是,缺少输出到std::ostream
的默认支持。代码
#include <iostream>
#include <boost/const_string.hpp>
const_string<char> x;
std::cout << x << endl;
不起作用,除非我们通过x
将c_str()
强制转换为c字符串
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()
来计算。我为我工作,但我不确定它是否适用于所有情况。我错过了什么吗?
答案 0 :(得分:3)
我错过了什么吗?
是的,只需加入const_string/io.hpp
即可。但它只是:
return o << std::basic_string<char_type, traits_type>(s.data(), s.size());
答案 1 :(得分:2)
根据应用于字符串流的区域设置和/或方面,这可能会产生影响,而不仅仅是在编写直接数据时。
性能较差,但是如何从const_string创建一个std :: string并使用<<
将其插入流中呢?
答案 2 :(得分:1)
不(你没有错过任何东西,afaik)。如果你的目标不是复制内容,str.data()就是你的选择。