std :: длина строки - PullRequest
       15

std :: длина строки

6 голосов
/ 15 ноября 2010

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

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

Ответы [ 4 ]

12 голосов
/ 15 ноября 2010

std::wstring::size() возвращает количество элементов широких символов в строке.Это не то же самое, что количество символов (как вы правильно заметили).

К сожалению, шаблон std::basic_string (и, следовательно, его экземпляры, такие как std::string и std::wstring) не зависят от кодировки,В этом смысле на самом деле это просто шаблон для строки байтов, а не строки символов.

2 голосов
/ 15 ноября 2010

Во-первых, 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 голосов
/ 15 ноября 2010

length() и size() обычно возвращают количество «символов» (независимо от ширины) в строке , исключая null, здесь длина и размер равны 2. capacity() возвращаетсколько памяти (читай: сколько символов, так как это многобайтово) обычно доступно, прежде чем строка будет перераспределена.

0 голосов
/ 15 ноября 2010
Метод

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

...