Spec-Zone.ru › Qt 6.0

Класс QStringTokenizer

шаблон <typename Haystack, typename Needle> class QStringTokenizer

Класс QStringTokenizer разбивает строки на токены по заданным разделителям. Подробнее...

Заголовок: #include <QStringTokenizer>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
С тех пор: Qt 6.0
Наследует: QtPrivate::Tok::HaystackPinning (приватный), QtPrivate::Tok::NeedlePinning (приватный) и
  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются повторно входящими.

Типы

const_iterator
const_pointer
const_reference
difference_type
iterator
pointer
reference
sentinel
size_type
value_type

Открытые функции

QStringTokenizer(Haystack haystack, Needle needle, Qt::SplitBehavior sb = Qt::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive)
QStringTokenizer(Haystack haystack, Needle needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb = Qt::KeepEmptyParts)
QStringTokenizer::iterator begin() const
QStringTokenizer::iterator cbegin() const
QStringTokenizer::sentinel cend() const
QStringTokenizer::sentinel end() const
LContainer toContainer(LContainer &&c = {}) const &
RContainer toContainer(RContainer &&c = {}) const &&

Связанные внешние члены

decltype(QtPrivate::Tok::TokenizerResult<Haystack, Needle>({std::forward<Haystack>(h), std::forward<Needle>(n), flags...})) qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)

Подробное описание

Разбивает строку на подстроки в местах, где встречается заданный разделитель, возвращая (лениво созданный) список этих строк. Если разделитель не совпадает нигде в строке, создаётся список с одной строкой, содержащий эту строку. Если разделитель пустой, QStringTokenizer производит пустую строку, за которой следуют каждый символ строки, за которым следует ещё одна пустая строка. Два перечисления Qt::SplitBehavior и Qt::CaseSensitivity дополнительно управляют выводом.

QStringTokenizer управляет QStringView::tokenize(), но, по крайней мере, с недавним компилятором, вы можете использовать его напрямую тоже:

for (auto it : QStringTokenizer{string, separator})
    use(*it);

Примечание: Никогда не следует явно называть аргументы шаблона для QStringTokenizer. Если вы можете использовать выведение аргументов шаблона класса C++17, вы можете написать QStringTokenizer{string, separator} (без аргументов шаблона). Если вы не можете использовать выведение аргументов шаблона класса C++17, вы должны использовать члены функций QStringView::split() или QLatin1String::split() и хранить возвращаемое значение только в auto переменных:

auto result = string.split(sep);

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

Ленивые последовательности

QStringTokenizer действует как так называемая ленивая последовательность, то есть каждый следующий элемент вычисляется только тогда, когда вы его запрашиваете. Ленивые последовательности имеют преимущество, что требуют только O(1) памяти. У них есть недостаток, что, по крайней мере, для QStringTokenizer, они позволяют только итерации вперёд, а не произвольный доступ.

Предполагается, что вы просто подключаете его к циклу for с диапазоном:

for (auto it : QStringTokenizer{string, separator})
    use(*it);

или C++20 алгоритму с диапазоном:

std::ranges::for_each(QStringTokenizer{string, separator},
                      [] (auto token) { use(token); });

Конечный определитель

Итераторы QStringTokenizer не могут использоваться с классическими алгоритмами STL, потому что они требуют пары итератор/итератор, в то время как QStringTokenizer использует определители. То есть, он использует другой тип, QStringTokenizer::sentinel, для обозначения конца диапазона. Это улучшает производительность, потому что определитель — это пустой тип. Определители поддерживаются с C++17 (для циклов for с диапазоном) и C++20 (для алгоритмов, использующих новую библиотеку диапазонов).

Временные объекты

QStringTokenizer очень тщательно разработан, чтобы избежать висячих ссылок. Если вы создаёте разделитель из временной строки (rvalue), этот аргумент хранится внутри, поэтому данные, на которые ссылаются, не удаляются до тех пор, пока они не будут разложены на токены:

auto tok = QStringTokenizer{widget.text(), u','};
// return value of `widget.text()` is destroyed, but content was moved into `tok`
for (auto e : tok)
   use(e);

Если вы передаёте именованные объекты (lvalues), QStringTokenizer не хранит копию. Вы несёте ответственность за то, чтобы данные именованного объекта сохранялись дольше, чем разделитель работает с ними:

auto text = widget.text();
auto tok = QStringTokenizer{text, u','};
text.clear();      // destroy content of `text`
for (auto e : tok) // ERROR: `tok` references deleted data!
    use(e);

См. также QStringView::split(), QString::split() и QRegularExpression.

Документация по типам членов

[alias] QStringTokenizer::const_iterator

Этот typedef предоставляет итератор типа STL для QStringTokenizer.

См. также iterator.

[alias] QStringTokenizer::const_pointer

Псевдоним для value_type *.

[alias] QStringTokenizer::const_reference

Псевдоним для value_type &.

[alias] QStringTokenizer::difference_type

Псевдоним для qsizetype.

[alias] QStringTokenizer::iterator

Этот typedef предоставляет итератор типа STL для QStringTokenizer.

QStringTokenizer не поддерживает изменяемые итераторы, поэтому он такой же, как const_iterator.

См. также const_iterator.

[alias] QStringTokenizer::pointer

Псевдоним для value_type *.

QStringTokenizer не поддерживает изменяемые итераторы, поэтому он такой же, как const_pointer.

[alias] QStringTokenizer::reference

Псевдоним для value_type &.

QStringTokenizer не поддерживает изменяемые ссылки, поэтому он такой же, как const_reference.

[alias] QStringTokenizer::sentinel

Этот typedef предоставляет определитель типа STL для QStringTokenizer::iterator и QStringTokenizer::const_iterator.

См. также const_iterator.

[alias] QStringTokenizer::size_type

Псевдоним для qsizetype.

[alias] QStringTokenizer::value_type

Псевдоним для const QStringView или const QLatin1String, в зависимости от аргумента шаблона Haystack разделителя.

Документация по функциям-членам

QStringTokenizer::iterator QStringTokenizer::begin() const

QStringTokenizer::iterator QStringTokenizer::cbegin() const

Возвращает константный итератор STL-стиля, указывающий на первый токен в списке.

См. также end() и cend().

QStringTokenizer::QStringTokenizer(Haystack haystack, Needle needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb = Qt::KeepEmptyParts)

QStringTokenizer::QStringTokenizer(Haystack haystack, Needle needle, Qt::SplitBehavior sb = Qt::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive)

Конструирует разделитель строк, который разбивает строку haystack на подстроки всякий раз, когда встречается needle, и позволяет итерироваться по этим строкам по мере их обнаружения. Если needle нигде не совпадает с haystack, генерируется единственный элемент, содержащий haystack.

cs определяет, должно ли needle соответствовать регистру или игнорировать регистр.

Если sb равно Qt::SkipEmptyParts, пустые элементы не отображаются в результате. По умолчанию пустые элементы включаются.

См. также QStringView::split(), QString::split(), Qt::CaseSensitivity и Qt::SplitBehavior.

QStringTokenizer::sentinel QStringTokenizer::cend() const

То же, что и end().

См. также cbegin() и end().

QStringTokenizer::sentinel QStringTokenizer::end() const

Возвращает константный итератор STL-стиля, указывающий на воображаемый токен после последнего токена в списке.

См. также begin() и cend().

template <typename LContainer> LContainer QStringTokenizer::toContainer(LContainer &&c = {}) const &

Преобразует ленивую последовательность в (обычно) контейнер с произвольным доступом типа LContainer.

Эта функция доступна только в том случае, если Container имеет value_type, соответствующий типу value_type данного разделителя.

Если для c указан именованный контейнер (lvalue), то этот контейнер заполняется, и возвращается ссылка на него. Если указан временный контейнер (rvalue, включая аргумент по умолчанию), то этот контейнер заполняется и возвращается по значению.

// assuming tok's value_type is QStringView, then...
auto tok = QStringTokenizer{~~~};
// ... rac1 is a QList:
auto rac1 = tok.toContainer();
// ... rac2 is std::pmr::vector<QStringView>:
auto rac2 = tok.toContainer<std::pmr::vector<QStringView>>();
auto rac3 = QVarLengthArray<QStringView, 12>{};
// appends the token sequence produced by tok to rac3
//  and returns a reference to rac3 (which we ignore here):
tok.toContainer(rac3);

Это обеспечивает максимальную гибкость в способе хранения последовательности.

template <typename RContainer> RContainer QStringTokenizer::toContainer(RContainer &&c = {}) const &&

Это перегруженная функция.

Преобразует ленивую последовательность в (обычно) контейнер с произвольным доступом типа RContainer.

В дополнение к ограничениям перегрузки lvalue-this, эта перегрузка rvalue-this доступна только тогда, когда этот QStringTokenizer не хранит строку-исходник внутри, так как это может создать контейнер, заполненный ссылками, ссылающимися на несуществующие данные:

auto tokens = QStringTokenizer{widget.text(), u','}.toContainer();
// ERROR: cannot call toContainer() on rvalue
// 'tokens' references the data of the copy of widget.text()
// stored inside the QStringTokenizer, which has since been deleted

Для исправления сохраните QStringTokenizer во временной переменной:

auto tokenizer = QStringTokenizer{widget.text90, u','};
auto tokens = tokenizer.toContainer();
// OK: the copy of widget.text() stored in 'tokenizer' keeps the data
// referenced by 'tokens' alive.

Вы можете заставить эту функцию существовать, передав представление вместо нее:

func(QStringTokenizer{QStringView{widget.text()}, u','}.toContainer());
// OK: compiler keeps widget.text() around until after func() has executed

Если вы передаете именованный контейнер (lvalue) для c, то этот контейнер заполняется, и возвращается ссылка на него. Если вы передаете временный контейнер (rvalue, включая аргумент по умолчанию), то этот контейнер заполняется и возвращается по значению.

Связанные внешние члены

[since 6.0] template <typename Haystack, typename Needle, typename Flags> decltype(QtPrivate::Tok::TokenizerResult<Haystack, Needle>({std::forward<Haystack>(h), std::forward<Needle>(n), flags...})) qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)

Функция-фабрика для QStringTokenizer, которая разбивает строку haystack на подстроки всякий раз, когда встречается needle, и позволяет итерироваться по этим строкам по мере их обнаружения. Если needle нигде не совпадает с haystack, генерируется единственный элемент, содержащий haystack.

Передайте значения из перечислений Qt::CaseSensitivity и Qt::SplitBehavior как flags для изменения поведения разделителя.

Вы можете использовать эту функцию, если ваш компилятор еще не поддерживает вывод шаблонов классов C++17 (CTAD). Мы рекомендуем использовать QStringTokenizer с CTAD вместо этого.

Эта функция была представлена в Qt 6.0.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qstringtokenizer.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API