Spec-Zone.ru › Qt 6.1

Класс QStringTokenizer

шаблон <typename Haystack, typename Needle> класс 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 (CTAD), вы можете написать QStringTokenizer{string, separator} (без аргументов шаблона). Если вы не можете использовать C++17 CTAD, вы должны использовать функции-члены 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

Возвращает 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, соответствующий типу значения данного токенизатора.

Если вы передаёте именованный контейнер (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.1/qstringtokenizer.html

Spec-Zone.ru

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