在c ++中附加缓冲区

时间:2012-03-30 15:24:48

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

谢谢!

4 个答案:

答案 0 :(得分:5)

你应该使用std::ostringstream,它们是高效的,更多的是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.
}

之后,您仍然可以使用operator<<ostringstream的末尾添加内容。

答案 1 :(得分: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");
    }
}

请注意,我使用了snprintf,它跟踪缓冲区的剩余长度。您总是使用此而不是不安全的版本。您的应用程序将不断发展,并通过极大的创造力您将找到一种方法来溢出此缓冲区。同时安全性为零额外成本。

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

答案 2 :(得分:2)

您将缓冲区作为输入和输出传递给sprintf。这是未定义的行为。

答案 3 :(得分:0)

你可能应该使用stringstream,但如果你想要更高的效率,那么我想你可以使用直接char *作为你的缓冲区,你只需要确保你增长它,除非你知道它不会超过1024字节