【发布时间】:2018-10-23 11:47:06
【问题描述】:
我的服务器收到一些请求,编译响应并将其发回。有时响应是一个文件,有时它是 HTML。所以我用以下方式定义响应:
class ResponseData
{
public:
bool operator== (const ResponseData & param) const { return id == param.id; }
public:
RequestIdType id;
RequestType type;
std::vector<char> data;
};
当我编译 HTML 响应时,我使用 std::stringstream。
std::vector<char> RequestHandler::createResponse( const RequestData * request ) const
{
std::stringstream buffer;
std::vector<char> result;
result.assign( RESPONSE_HEADER, RESPONSE_HEADER + strlen( RESPONSE_HEADER ) );
buffer << "<tr>";
for( auto param : request->paramsMap )
{
buffer << "<tr><td>" << param.first << "</td><td>" << param.second << "</td></tr>\n";
}
buffer << "<\tr>";
DEBUG_LOG_F << buffer.str();
std::string str = buffer.str();
result.insert( result.end(), str.begin(), str.end() );
result.insert( result.end(), RESPONSE_FOOTER, RESPONSE_FOOTER + strlen( RESPONSE_FOOTER ) );
return result;
}
在我看来,将buffer 复制到字符串以将其附加到向量并不是一个好主意。我怎样才能更有效地做到这一点?
【问题讨论】:
-
我建议进行以下优化。 1. 预先在结果中为所有内容预留空间。 2、从缓冲区中获取streambuf实例,然后使用其sgetn函数直接填充结果向量
-
您是否打算获得两个深
<tr>的结果? -
@NishantSingh,好像你错过了几行
-
@Caleth,谢谢。当然不。但主要问题是关于有效地将字符串流复制到向量
-
@Yura srry 我更新了评论
标签: c++ string stl stringstream