2010-11-15 3 views
6

Каков результат функции std :: wstring.length(), длина в wchar_t (s) или длина в символах? И почему?std :: wstring length

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::string и std::wstring) являются кодирующими-агностиками. В этом смысле это всего лишь шаблон для строки байтов, а не строка символов.

0

Метод размера возвращает текущее количество элементов в строке. Это то же самое, что и wstring :: length Люди обычно говорят о слове, предложении или абзаце, а не о его размере.

+0

Размер и длина являются синонимами –

+0

size_type string :: capacity() const Возвращает количество символов, которые может содержать строка без перераспределения. –

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 с разными размерами символов.

Способ разбора указателя элемента * до тех пор, пока символ символа, обозначенный символом char_traits, не будет достигнут.

Однако вы можете построить указатель и длину, и в этом случае он будет считывать количество символов, которые он вам сообщает, и будет содержать любые нулевые байты. У вас могут быть встроенные нулевые байты в basic_string, и если вы вызываете length() или size(), которые являются псевдонимами для одной и той же вещи, он расскажет вам, сколько символов оно содержит.

В char_traits нет магии для декодирования многоэлементных символов как одного, и вы не должны пытаться реализовать его таким образом.

+0

и почему именно этот ответ был отмечен? Я дал полезную информацию о том, что такое wstring и как она создается из указателя. – CashCow

Смежные вопросы