将非空终止向量 <char> 转换为字符串

Convert a non-null terminated vector<char> to string

我有一个非空终止的字符向量,我如何构造一个新字符串并让它自动插入 [=12=] 到字符串的末尾?

std::vector<char> v;
v.push_back('H');
v.push_back('i');
v.push_back('!');
//v.push_back('[=11=]'); <~ without using this line

std::string a(v.data());
std::string b(v.begin(), v.end()); // same meaning as b(v.data(), v.size())

两者之间正确的构造函数是什么?

std::string a(v.data()); 不正确。构造函数需要一个指向空终止字符序列的指针。不给它一个是未定义的行为。

另一方面,

std::string b(v.begin(), v.end()); 是完全安全的,会给你一个 std::string 与向量相同的内容。

您的第一次尝试将失败; std::string 可以从空终止字符数组构造,但如果没有空字符,构造函数将继续读取向量不拥有的内存,直到找到空字节。

您的第二次尝试就是解决方案; std:;string 将从迭代器中复制字符并自动添加终止空字符。

这个构造函数:

std::string a(v.data());

期望参数是指向以 null 结尾的 C 样式字符串的第一个字符的指针。由于 v.data() 不指向以 null 结尾的字符串,因此此构造函数调用具有未定义的行为。

您可以再添加一个参数以使构造函数调用有效:

std::string a(v.data(), v.size());

也就是说,不使用这个构造函数:

basic_string(const charT* s, const Allocator& a = Allocator());

你可以使用这个构造函数:

basic_string(const charT* s, size_type n, const Allocator& a = Allocator());

在这种情况下,字符串将完全根据向量中存储的 v.size() 个字符构建。

这个构造函数:

std::string b(v.begin(), v.end()); 

是有效的,实际上是另一种形式,与前面的构造函数相比,提供一个没有空终止符的范围。