Wil*_*mKF 6 c++ stl stringstream ostringstream stdvector
目前,我设置的值std::vector<char>从std::ostringstream如下:
void
foo(std::vector<char> &data, std::stringstream &stream) {
data = std::vector<char>(stream.str().begin(), stream.str().end());
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更有效的方法在C++中使用STL或者我在这里给出的方法是否合适?std::stringstream相反,我会更好吗?
K-b*_*llo 10
正如评论中所指出的,由于两次调用,您的代码不正确str().为了提高效率,您可以避免创建临时vector,如下所示:
void foo(std::vector<char> &data, std::stringstream &stream) {
const std::string& str = stream.str();
data.assign( str.begin(), str.end() );
}
Run Code Online (Sandbox Code Playgroud)
你也可以避免std::string使用std::istreambuf_iterators:
void foo(std::vector<char> &data, std::stringstream &stream) {
data.assign(
std::istreambuf_iterator<char>( stream ), std::istreambuf_iterator<char>()
);
}
Run Code Online (Sandbox Code Playgroud)
但鉴于这些是输入迭代器,vector没有机会知道将分配多少数据并且可能执行得更糟,因为它没有reserve足够的空间来避免重新分配.
您的方法调用未定义的行为.stream.str()返回字符串by-value,又称临时字符串.你获取begin一个临时的end迭代器和另一个的迭代器,创建一个无效的范围.
将流转换为容器的一种方法是使用公共迭代器接口:
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <iterator>
int main(){
std::stringstream src("....");
std::vector<char> dest;
// for a bit of efficiency
std::streampos beg = src.tellg();
src.seekg(0, std::ios_base::end);
std::streampos end = src.tellg();
src.seekg(0, std::ios_base::beg);
dest.reserve(end - beg);
dest.assign(std::istreambuf_iterator<char>(src), std::istreambuf_iterator<char>());
std::copy(dest.begin(), dest.end(), std::ostream_iterator<char>(std::cout));
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是缓存返回的std::string对象:
std::string const& s = stream.str();
data.reserve(s.size());
data.assign(s.begin(), s.end());
Run Code Online (Sandbox Code Playgroud)