将 boost::array<char> 复制到 std::string

8

我正在尝试将boost :: array <char>复制到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());

第二个也没有起作用。

那么,“不起作用”你到底是什么意思? - sth
2个回答

14
问题在于 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不会崩溃? - Dipro Sen
3
@DiproSen- 不,reserve无法解决这个问题。在使用std::copy之前,您需要调整字符串的大小以确保有足够的空间。reserve的作用完全不同。至于为什么没有崩溃,我完全不知道。这是未定义的行为,这意味着程序可以做任何事情。根据C++规范,不崩溃是完全合法的。 - templatetypedef

5

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

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

1
虽然这样做可以实现功能,但我认为与直接使用构造函数相比,效率要低得多。我怀疑编译器是否足够聪明,能够将其优化为块内存复制。 - templatetypedef
@templatetypedef 我同意。我想我发帖是为了完整起见。 - jrok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接