Основи програмування на С ++ для початківців

Класи string і wstring. Частина 5

клас string стандартної бібліотеки C ++ добре відомий і охоче використовуємо. Але не всі і не завжди замислюються над тим, що клас string, при деяких відмінностях у деталях - це і є контейнер вектор: vector<char> . правда, він доповнений деякими особливостями (але такий код і ви самі могли б написати):

  • метод size() задублірован методом довжина(). Вони повністю тотожні, з міркувань зручності. Просто для рядка природніше мати довжину, ніж розмір;

  • Визначено перевантажені операції +, += які повертають конкатенацію (об'єднання) строк;

  • визначено конструктор, започатковано string при створенні початковим значенням символьного рядка в форматі ASCIIZ (char* - Покажчик на символьний масив в стилі C завершується нулем);

  • визначено метод c_str(), який повертає покажчик на внутрішній вміст рядка в форматі ASCIIZ. Оскільки це внутрішнє значення, його можна використовувати, але не варто намагатися його змінювати. Це добре не закінчиться.

У всьому ж іншому рядки поводяться точно як вектор, і до них застосовні всі операції над векторами. розуміння того, що представляє собою клас string (vector<char>) може дозволити створити ряд несподіваних ефектів. Наприклад, оскільки нульовий символ не має для vector<char> ніякого особливого значення (на відміну від рядка C), то його теж цілком можна «заштовхувати» в кінець string. Тим самим можна помістити в єдину змінну string цілий масив C-рядків або навіть цілий текст.

Вот, як подібним чином помістити весь набір змінних оточення (навколишнє середовище) операційної системи в одну змінну string:

Примітка: тут ми використовували ще одну з допускаються форм головної функції програми main() – 3-м параметром якої є масив покажчиків рядків (char*) змінних оточення (навколишнє середовище). Ознакою закінчення масиву рядків envp є покажчик NULL (тих. документація операційної системи).

Результат:клас string, клас wstrting, Контейнери C ++ STL , Стандартна бібліотека шаблонів, контейнер з ++

Що щодо типу wstring? wstring - Це еквівалент vector<wchar_t> , вектор «широких», локалізованих символів, представляють інтернаціональну кодування символами Unicode. Розбір вмісту (поиск, виділення слів, розбиття на рядки і т.д.) російськомовної або будь-якого іншого рядка (китайської наприклад) можна робити тільки в форматі wtring (не string).

При цьому необхідно попередньо встановити правильну локаль для програми (локаль за замовчуванням “С” передбачає тільки ASCII символи в 7-бітному поданні). А для введення-виведення wstring пропонуються потоки, соответственно wcin і wcout, замість cin і cout, призначених для string. Це написано для нагадування.

У порядку ілюстрації розглянемо аналіз локалізованої рядки wstring на предмет того, чи є вона паліндромом.

Пропуски і розділові знаки при порівняннях пропускаються:

Буква L перед символьної константою означає, що записана далі рядок , записана в широких символах wchar_t

Результат:клас string, клас wstrting, Контейнери C ++ STL , Стандартна бібліотека шаблонів, контейнер з ++

Локалізації - це вже зовсім інша тема, яка далеко відведе нас від нашої основної теми. Обговорення питань локалізації та широких символів в C / C ++ можна почитать здесь.

Мабуть, в цій частині доречно відзначити наступні обставини, які стосуються усіх типів контейнерів STL. При створенні контейнера конструктором без параметрів, створюється порожній контейнер, який не містить ще жодного елемента (заготівля для майбутнього заповнення контейнера).

Розмір такого контейнера (метод size(), или довжина() для строк) дорівнює нулю. але ефективніше, з точки зору продуктивності, перевіряти контейнери на порожнечу методом empty(), який присутній у всіх типах контейнерів.

5 думки про "Класи string і wstring. Частина 5

  1. Дякую автору за статті.
    Але у мене питання – чому ви не укладаєте оператор умови в фігурні дужки? Адже це не дуже читабельно. Наприклад:
    while (*p != 0) {
    if (0 == strncmp(p, find, strlen(find)))
    break;
    p += strlen(p) + 1;
    }

    или так:
    while (*p != 0) {
    if (0 == strncmp(p, find, strlen(find))) {
    break;
    }
    p += strlen(p) + 1;
    }

    Другий варіант однозначно наочніше…

    1. тому, що питання форматування коду – справа смаку, переваг, і на цей рахунок є досить багато різних думок.

      P.S. юне дурачьё (наприклад на Хабрахабр) гордо називає це кодестайл і роблять з цього фетиш, самоціль. Але програмний код пишеться не для естетичного задоволення (як красивіше скобочки розставити), а для того, щоб він бездоганно працював. Але про це, тому що це інженерна спеціальність, а не естетична забава, в останні років 10 як-то стали забувати.

      1. Будь-який дурень може написати код, зрозумілий комп'ютеру. Хороший програміст пише код, зрозумілий людині.
        – Мартін Фаулер

        ви бачите… якщо Ви пишете код для комп'ютера, для досягнення власних цілей і для власного задоволення – то будь ласка, ніхто не забороняє і не сказав би Вам нічого проти, але чомусь цей мені і людям доводиться бачити цей код, читати його…
        Останнім часом читання коду людьми і розуміння написаного грає ключову роль в написанні програмних систем, люди змінюються, а розробляти продукт потрібно продовжувати, хоча звичайно, як я і казав раніше, це не відноситься якщо Ви пишете код тільки в своєму проекті над яким не працюють інші люди.

        р / с:
        в даному випадку, дійсно лише справа смаку ставити скобочки чи ні, я пишу лише з приводу Вашої відповіді.

      2. Дмитро, ще раз повторю … для кращого засвоєння: існують кілька різних стилів форматування коду C / C ++. І жоден з них не краще і не гірше за інших.
        Мені довелося працювати в декількох розробницького софтверних компаніях, у яких були зовсім різні корпоративні вимоги (kodestayl). Так що стиль потрібно вибирати той, який використовується в поточному проекті.

Залишити коментар до Олексій Скасувати відповідь

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *