【问题标题】:How to most efficiently construct a std::string from char * with size如何最有效地从具有大小的 char * 构造 std::string
【发布时间】:2013-01-23 19:16:41
【问题描述】:

我正在寻找一种通过std::string 实现sprintf() 功能的方法,我从std::string formatting like sprintf 找到了一个很好的答案。虽然这有点 hacky,因为它直接写入从 string.c_str() 返回的指针。所以我使用char *malloc()realloc() 重新实现了它。

std::string string_format(const char * format, ...) {
    size_t size;
    size_t n;
    va_list args;
    char * buffer;
    std::string str;

    size = 100;
    buffer = malloc(size);
    for (;;) {
        va_start(args, format);
        n = vsnprintf(buffer, size, format, args);
        va_end(args);
        if (n > -1) {
            if (n < size) {
                size = n;
                break;
            }
            size = n + 1;
        } else {
            size *= 2;
        }
        buffer = realloc(buffer, size);
    }

    str = std::string(buffer, size);

    free(buffer);
    return str;
}

我知道我可以做到:

str = std::string(buffer);

但是它必须基本上做strlen(buffer)。我可以通过以下方式使它变得更好:

str = std::string(buffer, size);

但是使用string.swap() 通过交换内部缓冲区而不是复制它会更有效吗?

str.swap(std::string(buffer, size));

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你可以写入C++11中&amp;str[0]检索到的缓冲区,只要你在null之前停下来,并且根本不接触null。
  • 添加到@chris,你也可以使用string::reserve来扩展它
  • 看看boost format 是如何做到的可能是值得的。另外,您是否考虑过使用可变参数模板而不是可变参数?
  • 可以说,是的,swap 会更有效,除非您通过发布两种情况的分析数据来证明并非如此。如果你真的认为这是一个瓶颈,那么你应该这样做。
  • 我认为你应该分析你的程序,看看这是否真的是一个瓶颈。

标签: c++ std stdstring


【解决方案1】:

只需使用str.assign(buffer, size);

【讨论】:

  • 这正是我想要的。
猜你喜欢
  • 2016-04-04
  • 2020-08-20
  • 1970-01-01
  • 2019-03-22
  • 2015-04-26
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多