Jos*_*hua 3 c++ string map type-conversion
我试图有效地将地图的内容转换为字符串以通过套接字发送.到目前为止我有这个...
char buffer[1024];
for (iter = my_mapy.begin(); iter != my_map.end();iter++)
{
sprintf(buffer, "%s|%ld|%d", buffer, iter->first, iter->second);
}
Run Code Online (Sandbox Code Playgroud)
虽然这是有效的,但我想知道它是否效率低下.Google搜索将int/long/double转换为string的最有效方法导致了sprintf,这就是我使用它的原因.但我担心缓冲区的内容会被反复复制,而我只是想追加到最后.这是正确的,如果是这样,有没有更好的方法来做到这一点?性能和速度是第一优先.
谢谢!
你应该使用std::ostringstreams,它们是高效的,更多的是C++ - ish:
#include <sstream>
std::ostringstream oss;
for (iter = my_mapy.begin(); iter != my_map.end();iter++)
{
oss << iter->first << "|" << iter->second;
//oss.str() returns the string in which everything was stored.
}
Run Code Online (Sandbox Code Playgroud)
在那之后,您仍然可以使用operator<<在末尾添加内容ostringstream.
你是对的; 你在这里提出的解决方案每次都会复制缓冲区.要做得更好,您必须使用sprintf的返回值.
char buffer[1024];
char* end_of_buffer = buffer;
std::size_t remaining_space = sizeof(buffer);
for (auto iter = my_map.begin(); iter != my_map.end(); iter++)
{
int written_bytes = snprintf(end_of_buffer, remaining_space, "|%ld|%d", iter->first, iter->second);
if (written_bytes > 0) {
end_of_buffer += written_bytes;
remaining_space -= written_bytes;
} else {
perror("Something is wrong with the buffer");
}
}
Run Code Online (Sandbox Code Playgroud)
顺便提一下,请注意我使用的snprintf,它跟踪缓冲区的剩余长度.您应该始终使用此而不是不安全的版本.您的应用程序将不断发展,通过极大的创造力,您将找到一种溢出此缓冲区的方法.同时安全性为零额外成本.
(当然,我的意思是没有冒犯.)