【问题标题】:Copying boost::array<char> to std::string将 boost::array<char> 复制到 std::string
【发布时间】:2012-06-14 19:49:17
【问题描述】:

我正在尝试将boost::array&lt;char&gt; 转换为std::string

boost::array<char, 1024> _buffer;
std::string data;
std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, data.begin());

这不起作用。所以我稍微改了一下。

char _buffer[1024];
std::string data;
std::copy(_buffer, _buffer+bytes_transferred, data.begin());

第二个也不行。

【问题讨论】:

  • 那么“不工作”到底是什么意思?

标签: c++ string boost iterator stdstring


【解决方案1】:

这里的问题是copy 假设您正在写入的数据已经存在空间;它不会为您创造任何新空间。因此,上述两段代码都会导致未定义的行为,因为您要将字符复制到以前未保留空间的位置。

最好的方法是使用string 构造函数:

boost::array<char, 1024> _buffer;
std::string data(_buffer.begin(), _buffer.end());

char _buffer[1024];
std::string data(_buffer, _buffer + 1024);

这会将字符串初始化为存储在数组中的数据的副本。

希望这会有所帮助!

【讨论】:

  • 如果我想使用std::copy,我需要reserve()吗?为什么std::copy 不崩溃?
  • @DiproSen- 不,reserve 不会解决这个问题。您需要resize 字符串,以便在使用std::copy 之前有足够的空间。 reserve 提供完全不同的功能。至于为什么没有崩溃,我完全不知道。这是未定义的行为,这意味着程序可以做任何事情。根据 C++ 规范,不崩溃是完全合法的。
【解决方案2】:

您可以使用back_insert_iterator。分配给它会调用底层容器的push_back 函数,因此您无需担心手动分配空间。

std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, std::back_inserter(data));

【讨论】:

  • 虽然这可行,但我认为它比仅使用构造函数效率低得多。我怀疑编译器是否足够聪明,无法意识到它可以将其优化为块内存副本。
  • @templatetypedef 我同意。我猜是为了完整起见,我发布了这个。
猜你喜欢
  • 2017-08-22
  • 1970-01-01
  • 2012-06-09
  • 2012-01-06
  • 2014-01-11
  • 1970-01-01
  • 2015-01-24
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多