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

Оціни цю статтю




c ++ для початківців, клас string, клас wstring, Контейнери C ++ STL , Стандартна бібліотека шаблонів, контейнер з ++клас 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(), який присутній у всіх типах контейнерів.

Нові уроки з програмування:

Olej

Про Olej

Стаж практичних програмних розробок близько 40 лет. Викладач міжнародної софтверної компанії Global Logic. Постійний автор публікацій IBM Developer Works. Науковий редактор книжкового видавництва комп'ютерної літератури "Символ-Плюс", Санкт-Петербург.

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

  1. Дякую автору за статті.
    Але у мене питання – чому ви не укладаєте оператор умови в фігурні дужки? Адже це не дуже читабельно. Наприклад:

    или так:

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

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

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

      1. Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку.
        Мартин Фаулер

        Видите лиесли Вы пишете код для компьютера, для достижения собственных целей и для собственного удовлетворениято пожалуйста, никто не запрещает и не сказал бы Вам ничего против, но почему-то этот мне и людям приходится видеть этот код, читать его
        В последнее время чтение кода людьми и понимание написанного играет ключевую роль в написании программных систем, люди меняются, а разрабатывать продукт нужно продолжать, хотя конечно, как я и сказал ранее, это не относится если Вы пишете код только в своём проекте над которым не работают другие люди.

        p/s:
        в данной ситуации, действительно лишь дело вкуса ставить скобочки или нет, я пишу лишь по поводу Вашего ответа.

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

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>