9

std::wstring 的内部结构是什么?包括长度吗?它是否为空终止?两个都?

4

3 回答 3

14

是否包括长度

是的。它是 C++11 标准所要求的。

§ 21.4.4

size_type size() const noexcept;
1.返回:当前字符串中类似字符的对象的数量。
2.复杂性:恒定时间。

但是请注意,这不知道 unicode。


是否为空终止

是的。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,使得p + i == &operator[](i)对于每个iin [0,size()]
2.复杂性:恒定时间。
3.要求:程序不得更改存储在字符数组中的任何值。

于 2013-07-30T06:41:36.917 回答
11

我们不知道。这完全取决于实施。(至少在 C++03 之前 - 显然 C++11 要求内部缓冲区以 0 结尾。)如果您使用的是开源的,您可以查看 C++ 标准库实现的源代码。


除此之外,如果它是 NUL 终止的并且它也存储了一个明确的长度,我会发现它是合乎逻辑的。这很好,因为返回长度 有效的 C 字符串需要恒定的时间:

size_t length()
{
    return m_length;
}

const wchar_t *c_str()
{
    return m_cstr;
}

如果它没有存储明确的长度,则size()必须将字符数到NULin O(n),如果可以避免的话,这是一种浪费。

但是,如果内部缓冲区不是以 NUL 结尾的,而只是存储了长度,那么创建一个适当的以 NUL 结尾的 C 字符串将是乏味的:该字符串必须重新分配其存储空间并附加 0 (并且重新分配是一个昂贵的操作),或者它必须复制整个缓冲区,这又是一个O(n)操作。

(警告:无耻的自我推销——在我目前正在从事的一个 C 语言项目中,我正是采用这种方法来实现灵活的字符串对象。)

于 2013-07-30T06:04:33.353 回答
0

basic_string (其中 wstring 是 typedef)不需要终止符。

是的,它管理自己的长度。

如果您需要一个以 null 结尾的(也称为 C 字符串)版本的 string/wstring,请调用 c_str()。但是它可以在其中包含一个空字符,在这种情况下,几乎每个处理 C 字符串的 C 函数都将无法看到整个字符串。

于 2013-07-30T06:04:59.647 回答