2010-11-15 116 views
6

std :: wstring.length()函数的结果是什么,wchar_t(s)中的长度或符号的长度?为什么?std :: wstring长度

TCHAR r2[3]; 
r2[0] = 0xD834; // D834, DD1E - musical G clef 
r2[1] = 0xDD1E; // 
r2[2] = 0x0000; // '/0' 

std::wstring r = r2; 

std::cout << "capacity: " << r.capacity() << std::endl; 
std::cout << "length: " << r.length() << std::endl; 
std::cout << "size: "  << r.size()  << std::endl; 
std::cout << "max_size: " << r.max_size() << std::endl; 

Output> 

capacity: 351 
length: 2 
size: 2 
max_size: 2147483646 

回答

11

std::wstring::size()返回字符串中宽字符元素的数量。这与字符数量不同(正如您正确注意到的那样)。

不幸的是,std::basic_string模板(以及它的实例,如std::stringstd::wstring)是编码不可知的。从这个意义上讲,它实际上只是一个字节串而不是一串字符的模板。

0

size方法返回字符串中当前元素的数量。它与wstring :: length相同 人们通常会谈论单词,句子或段落的长度,而不是其大小

+0

大小和长度是同义词 – 2010-11-15 11:21:19

+0

size_type string :: capacity()const 返回字符串可以容纳的字符数量,无需重新分配。 – 2010-11-15 11:22:07

0

length()size()通常不含的null字符串在返回的“字符”(不考虑宽度)的数量,这里的长度&大小是2 capacity()返回多少内存(读:多少个字符,如这是多字节)通常在字符串重新分配之前可用。

1

首先,std :: wstring是std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >的一个实例。

虽然大部分真正的工作都是由char_traits完成的,并且可以自己编写,但主要是为了使用不同字符大小的C运行时库。

解析Element *指针的方法是,直到达到char_traits指示的字符作为终止符。

但是,您可以使用指针和长度来构造,在这种情况下,它将读取它告诉您的字符数,其中将包含任何空字节。您可能在basic_string中嵌入了空字节,并且如果您调用作为同一事物的别名的length()或size(),它会告诉您它包含多少个字符。

char_traits没有什么魔法可以将多元素字符解码为一体,也不应该尝试以这种方式实现它。

+0

为什么这个答案被标记下来?我给出了有关wstring究竟是什么以及如何从指针构造的有用信息。 – CashCow 2010-11-17 11:21:46