在c ++中附加缓冲区

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,这就是我使用它的原因.但我担心缓冲区的内容会被反复复制,而我只是想追加到最后.这是正确的,如果是这样,有没有更好的方法来做到这一点?性能和速度是第一优先.

谢谢!

mfo*_*ini 5

你应该使用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.

  • *"......永远不要超过1024 ......"* - 着名的遗言. (5认同)
  • +1 - 它们还消除了潜在的缓冲区溢出问题. (2认同)

And*_*ack 5

你是对的; 你在这里提出的解决方案每次都会复制缓冲区.要做得更好,您必须使用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,它跟踪缓冲区的剩余长度.您应该始终使用此而不是不安全的版本.您的应用程序将不断发展,通过极大的创造力,您将找到一种溢出此缓冲区的方法.同时安全性为零额外成本.

(当然,我的意思是没有冒犯.)