c++ - 在 C++ 中附加到缓冲区

标签 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);
}

虽然这行得通,但我想知道它是否效率低下。 Google 搜索将 int/long/double 转换为字符串的最有效方法,结果是 sprintf,这就是我使用它的原因。但我担心缓冲区的内容被一遍又一遍地复制,而我只想追加到最后。这是正确的吗?如果是这样,是否有更好的方法来做到这一点?性能和速度是第一要务。

谢谢!

最佳答案

你是对的;您在此处提出的解决方案每次都会复制缓冲区。为了做得更好,您将不得不利用 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");
    }
}

请注意,顺便说一句,我使用了 snprintf,它跟踪缓冲区的剩余长度。你应该总是使用这个而不是不安全的版本。您的应用程序会不断发展,并且通过出色的创造力,您会找到一种方法 来溢出此缓冲区。同时,安全性是零额外成本。

(当然我没有冒犯的意思。)

关于c++ - 在 C++ 中附加到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945938/

相关文章:

python - python中的序列化字符串PK

Java:new Properties(...) 和 new Properties().putAll(...) 之间的区别

c++ - 将指针传递给声明为友元的类成员的 pthread

c++ - 如何在 64 位应用程序中获取模块大小?

c++ - 如何检查日期格式的有效性(例如,%d/%m/%Y-%H :%M:%S)?

c++ - std::logic_error::logic_error 未定义

c# - 在 C# 中从字符串中剪切

python - 打印包含字符串和 2 个其他变量的变量

map - 如何通过一些图像/电影帧创建房间的 2D map ?

Javascript过滤器与 map 问题