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

Dip*_*Sen 7 c++ string boost iterator stdstring

我想cvopy boost::array<char>std::string.

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

这是行不通的.所以我稍微改了一下.

char _buffer[1024];
std::string data;
std::copy(_buffer, _buffer+bytes_transferred, data.begin());
Run Code Online (Sandbox Code Playgroud)

第二个也没有工作.

tem*_*def 15

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

执行此操作的最佳方法是使用string构造函数:

boost::array<char, 1024> _buffer;
std::string data(_buffer.begin(), _buffer.end());
Run Code Online (Sandbox Code Playgroud)

要么

char _buffer[1024];
std::string data(_buffer, _buffer + 1024);
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!

  • @DiproSen-不,`reserve`不会解决这个问题.您需要"调整大小"字符串,以便在使用`std :: copy`之前有足够的空间.`reserve`提供完全不同的功能.至于为什么没有崩溃,我绝对不知道.它是未定义的行为,这意味着程序可以做任何事情.C++规范不会崩溃是完全合法的. (3认同)

jro*_*rok 5

您可以使用back_insert_iterator.分配给它将调用push_back底层容器的功能,因此您不必担心手动分配空间.

std::copy(_buffer.begin(), _buffer.begin()+bytes_transferred, std::back_inserter(data));
Run Code Online (Sandbox Code Playgroud)