Класс 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-стиля, указывающий на первый токен в списке.
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().
QStringTokenizer::sentinel QStringTokenizer::end() const
Возвращает константный итератор STL-стиля, указывающий на воображаемый токен после последнего токена в списке.
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