Namespace std не содержит string

Namespace std не содержит string

Этот код имеет неопределенное поведение:

Причина в том что std::string_view может хранить строки с ненулевым символом в конце и не включает в себя нулевой терминатор при вызове data , Это действительно ограничивает, так как для приведенного выше кода, определяющего поведение, я должен построить std::string из этого:

Это действительно делает std::string_view в этом случае нет необходимости, мне все еще нужно скопировать строку, переданную foo так почему бы не использовать семантику перемещения и изменения msg к std::string ? Это может быть быстрее, но я не измерял.

В любом случае, необходимо построить std::string каждый раз, когда я хочу передать const char* к функции, которая принимает только const char* это немного излишне, но должна быть причина, почему Комитет решил это так.

Итак, почему std::string_view::data не возвращать строку с нулевым символом в конце, например std::string::data ?

Решение

Итак, почему std :: string_view :: data не возвращает нулевое окончание
строка типа std :: string :: data

Просто потому, что не может. string_view может быть более узким видом на большую строку (подстроку строки). Это означает, что строка Количество просмотров не обязательно будет иметь нулевое завершение в конце определенного представления. Вы не можете записать нулевой терминатор в основную строку по понятным причинам, и вы не можете создать копию строки и вернуть char * без утечки памяти.

Если вы хотите завершить нулевую строку, вам нужно создать std::string скопировать из него.

Позвольте мне показать хорошее использование std::string_view :

Здесь результирующий вектор содержит токены как представления в большей строке.

Другие решения

Цель string_view должен быть диапазоном, представляющим непрерывную последовательность символов. Ограничение такого диапазона диапазоном, заканчивающимся NUL-ограничителем, ограничивает полезность класса.

При этом было бы полезно иметь альтернативную версию string_view который предназначен только для того, чтобы быть созданным из строк, которые действительно заканчиваются NUL.

Читайте также:  Tp link archer c20 iptv

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

Вы будете удивлены тем, как мало операций вы потеряете от string_view чтобы сделать эту работу:

В современном стандарте C++ определен класс с функциями и свойствами (переменными) для организации работы со строками (в классическом языке C строк как таковых нет, есть лишь массивы символов char ):

Для работы со строками также нужно подключить стандартный namespace :

В противном случае придётся везде указывать описатель класса std::string вместо string .

Ниже приводится пример программы, работающей со string (в старых си-совместимых компиляторах не работает!):

Основные возможности, которыми обладает класс string :

  • инициализация массивом символов (строкой встроенного типа) или другим объектом типа string . Встроенный тип не обладает второй возможностью;
  • копирование одной строки в другую. Для встроенного типа приходится использовать функцию strcpy() ;
  • доступ к отдельным символам строки для чтения и записи. Во встроенном массиве для этого применяется операция взятия индекса или косвенная адресация с помощью указателя;
  • сравнение двух строк на равенство. Для встроенного типа используются функции семейства strcmp() ;
  • конкатенация (сцепление) двух строк, дающая результат либо как третью строку, либо вместо одной из исходных. Для встроенного типа применяется функция strcat() , однако чтобы получить результат в новой строке, необходимо последовательно задействовать функции strcpy() и strcat() , а также позаботиться о выделении памяти;
  • встроенные средства определения длины строки (функции-члены класса size() и l ength() ). Узнать длину строки встроенного типа можно только вычислением с помощью функции strlen() ;
  • возможность узнать, пуста ли строка.

Рассмотрим эти базовые возможности более подробно.

Читайте также:  Quake 3 arena персонажи

Инициализация строк при описании и длина строки (не включая завершающий нуль-терминатор):

Строка может быть задана и пустой:

Для проверки того, пуста ли строка, можно сравнить ее длину с 0:

или применить метод empty() , возвращающий true для пустой строки и false для непустой:

Третья форма создания строки инициализирует объект типа string другим объектом того же типа:

Строка st3 инициализируется строкой st . Как мы можем убедиться, что эти строки совпадают? Воспользуемся оператором сравнения ( == ):

Как скопировать одну строку в другую? С помощью обычной операции присваивания:

Для сцепления строк используется операция сложения ( + ) или операция сложения с присваиванием ( += ). Пусть даны две строки:

Мы можем получить третью строку, состоящую из конкатенации первых двух, таким образом:

Если же мы хотим добавить s2 в конец s1 , мы должны написать:

Операция сложения может сцеплять объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом char * , а значимые слова – объектами класса string :

Подобные выражения работают потому, что компилятор "знает", как автоматически преобразовывать объекты встроенного типа в объекты класса string . Возможно и простое присваивание встроенной строки объекту string :

Обратное преобразование при этом не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции:

Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с названием c_str() ("строка Си"):

Функция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе. Ключевое слово const здесь предотвращает "опасную" в современных визуальных средах возможность непосредственной модификации содержимого объекта через указатель.

К отдельным символам объекта типа string , как и встроенного типа, можно обращаться с помощью операции взятия индекса. Вот, например, фрагмент кода, заменяющего все точки символами подчеркивания:

Читайте также:  Android for windows phone

Но лучше читать документацию по C++ и пользоваться его возможностями. Например, предыдущее действие мы могли бы выполнить вызовом одной-единственной функции replace() :

Правда, здесь использован не метод replace класса string , а одноимённый алгоритм:

Поскольку объект string ведет себя как контейнер, к нему могут применяться и другие алгоритмы. Это позволяет решать задачи, не решаемые напрямую функциями класса string .

Ниже приводится краткое описание основных операторов и функций класса string , ссылки в таблице ведут к русскоязычным описаниям в интернете. Более полный список возможностей класса string можно получить, например, в Википедии или на сайте cplusplus.com.

Задание символов в строке

присваивает значения строке

назначает символы строке

Доступ к отдельным символам

получение указанного символа с проверкой выхода индекса за границы

получение указанного символа

получение первого символа

получение последнего символа

возвращает указатель на первый символ строки

возвращает немодифицируемый массив символов С , содержащий символы строки

Проверка на вместимость строки

проверяет, является ли строка пустой

возвращает количество символов в строке

возвращает максимальное количество символов

на самом простом поймал ошибки, при объявлении std::optional ругается на отсутствие члена optional в пространстве имен. В чем может быть проблема

2 ответа 2

Подобная ошибка выдается Visual Studio 2017 если в установках проекта не выбран режим C++17 ( /std:c++17 ). При этом в окне Output она сопровождается сообщением

Я подозреваю, что вы разглядываете ошибки компиляции в этом "новом" странном GUI-шном окне Errors , вместо того, чтобы пойти в нормальное человеческое окно Output и посмотреть полный вывод компилятора там. По этой причине вы и не увидели вышеупомянутого сообщения.

Ссылка на основную публикацию
Adblock detector