std::wstring的内部结构是什么?它包含长度吗?它是以null结尾的吗?还是两者都有?
std::wstring的内部结构是什么?它包含长度吗?它是以null结尾的吗?还是两者都有?
它包括长度吗?
是的。这是C++11标准所必需的。
§ 21.4.4
size_type size() const noexcept;
1. 返回: 当前字符串中类似字符的数量计数。
2. 复杂度: 常数时间。
请注意,此操作不考虑Unicode编码。
它是以null结尾的吗?
是的。C++11标准还要求std::basic_string::c_str
在范围[0,size()]内返回有效指针,其中my_string[my_string.size()]
将有效,因此需要一个空字符。
§ 21.4.7.1
const charT* c_str() const noexcept;
const charT* data() const noexcept;
1. 返回: 指针p
,使得对于[0,size()]
中的每个i
,p + i == &operator[](i)
。
2. 复杂度: 常数时间。
3. 要求: 程序不得更改字符数组中存储的任何值。
wchar_t
头和尾指针并取其差,您可以在不必存储长度的情况下以恒定时间获取长度。 - SheetJS我们不知道,这完全取决于实现。 (至少到 C++03 - 显然 C++11 要求内部缓冲区为 0 结尾。) 如果你使用的开源库,你可以查看 C++ 标准库实现的源代码。
size_t length()
{
return m_length;
}
const wchar_t *c_str()
{
return m_cstr;
}
size()
将不得不计算字符直到NUL
为止,这是一种浪费,如果可以避免的话。O(n)
操作。basic_string(其中wstring是typedef)不需要终止符。
是的,它管理自己的长度。
如果您需要一个以null结尾(也称为C字符串)的string/wstring版本,请调用c_str()。但是它可以在内部包含空字符,在这种情况下,几乎每个处理C字符串的C函数都将无法查看整个字符串。
.c_str()
成员函数的使用方法和原因。此外,我希望您了解C标准库中的宽字符串处理函数,例如wstrlen()
。 - user529758