是否可以获取指向存储在字符串流对象中的字符串的指针。基本上我想将字符串从该位置复制到另一个缓冲区.. 我发现我可以从代码下面得到长度
myStringStreamObj.seekg(0, ios::end);
lengthForStringInmyStringStreamObj = myStringStreamObj.tellg();
我知道我总能做myStringStreamObj.str().c_str()
。但是我的探查器告诉我这段代码需要时间,我想避免它。因此我需要一些好的替代方法来获取指向该字符串的指针。
我的探查器还告诉我,代码的另一部分[{1}}也很慢。有人可以指导我这个。
拜托,我不能避免使用stringstream作为一个大代码的一部分,我无法改变/不允许更改。
答案 0 :(得分:1)
答案是" no"。获取格式化字符串内容的唯一文档API是str
()方法。
当然,无论您使用何种编译器或平台,都可能拥有自己特定的非标准和/或非文档化方法来访问{{{}的内部结构。 1}}对象;这可能会更快。因为您的问题没有指定任何特定的编译器或实现,所以我必须得出结论,您正在寻找一个符合标准的可移植答案;所以在这种情况下的答案几乎是一个"没有"。
如果任何特定的编译器或平台,即使是某些可能拥有"声誉的人,我真的会感到惊讶。对于中毒语言标准< cough> ,将提供任何替代方案。我希望所有实现都希望保持内部stringstream
移动设备的私密性,以便在将来的版本中调整它们,而不会破坏二进制ABI兼容性。
您可能想要调查的唯一其他可能性是使用其迭代器获取stringstream
的内容。当然,这是一种完全不同的机制,用于提取stringstream
中的内容。并不像在一个银盘上用一种方法把你串起来一样简单直接;所以它可能会涉及一个相当重要的代码重写,它与返回的字符串一起使用。但有可能迭代stringstream
中的内容可能会变得更快,因为可能不需要实现来分配新的stringstream
实例std::string
()的好处,并将所有内容都塞进其中。
在您的情况下,迭代是否会更快取决于您的实现str
的工作方式以及编译器的效率。找出答案的唯一方法是继续进行,然后分析结果。
答案 1 :(得分:1)
我无法提供符合标准的便携式方法。
虽然您无法获得内部缓冲区,但您可以提供自己的缓冲区。
根据标准设置,std::stringbuf
对象的内部缓冲区具有实现定义的行为。
cplusplus.com: std::stringbuf::setbuf()
正如我在 GCC 4.8.2 的实现中所发生的那样,行为是使用您提供的外部缓冲区,而不是内部std::string
。
所以你可以这样做:
int main()
{
std::ostringstream oss;
char buf[1024]; // this is where the data ends up when you write to oss
oss.rdbuf()->pubsetbuf(buf, sizeof(buf));
oss << "Testing" << 1 << 2 << 3.2 << '\0';
std::cout << buf; // see the data
}
但我强烈建议您只做这样的事情作为(非常)临时措施,同时根据标准找出更有效的便携式东西。
说了所有我看过我的实现如何实现std::stringstream::str()
并且它基本上返回其内部std::string
,因此您可以直接访问并且在启用优化时应该完全优化函数调用。 所以这应该是首选方法。