我正在尝试有效地将地图内容转换为通过套接字发送的字符串。到目前为止我有这个......
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,这就是我使用它的原因。但我担心缓冲区的内容会被反复复制,而我只是想追加到最后。这是正确的,如果是这样,有没有更好的方法来做到这一点?性能和速度是第一优先。
谢谢!
答案 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字节