Spec-Zone.ru › Qt

Класс QStringTokenizer

template <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 (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 (для циклов с диапазоном) и C++20 (для алгоритмов, использующих новую библиотеку диапазонов).

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

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

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);

Если вы передаете именованные объекты (значения-ссылки), 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-стиль sentinel, указывающий на воображаемый токен после последнего токена в списке.

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

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

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

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

Если вы передаёте именованный контейнер (lvalue) для c, то этот контейнер заполняется, и возвращается ссылка на него. Если вы передаёте временный контейнер (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 не хранит строку haystack внутри, так как это могло бы создать контейнер, заполненный висячими ссылками:

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 Class Template Argument Deduction (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.2/qstringtokenizer.html

Spec-Zone.ru

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