Sur cette page

QStringTokenizer Class

template <typename Haystack, typename Needle> class QStringTokenizer

La classe QStringTokenizer divise les chaînes de caractères en tokens selon des séparateurs donnés. Plus d'informations...

En-tête : #include <QStringTokenizer>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Depuis : Qt 6.0
Hérite de : QtPrivate::Tok::HaystackPinning (private), QtPrivate::Tok::NeedlePinning (private), et

Note : Toutes les fonctions de cette classe sont réentrantes.

Types publics

Fonctions publiques

QStringTokenizer(Haystack haystack, Needle needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb = Qt::KeepEmptyParts)
QStringTokenizer(Haystack haystack, Needle needle, Qt::SplitBehavior sb = Qt::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive)
QStringTokenizer<Haystack, Needle>::iterator begin() const
QStringTokenizer<Haystack, Needle>::iterator cbegin() const
QStringTokenizer<Haystack, Needle>::sentinel cend() const
QStringTokenizer<Haystack, Needle>::sentinel end() const
LContainer toContainer(LContainer &&c = {}) const &
RContainer toContainer(RContainer &&c = {}) const &&
(since 6.0) auto qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)

Description détaillée

Divise une chaîne de caractères en sous-chaînes à chaque fois qu'un séparateur donné apparaît, et renvoie une liste (paresseusement construite) de ces chaînes de caractères. Si le séparateur ne correspond à aucun élément de la chaîne, elle produit une liste à un seul élément contenant cette chaîne. Si le séparateur est vide, QStringTokenizer produit une chaîne vide, suivie de chacun des caractères de la chaîne, puis d'une autre chaîne vide. Les deux énumérations Qt::SplitBehavior et Qt::CaseSensitivity permettent de contrôler davantage la sortie.

QStringTokenizer pilote QStringView::tokenize(), mais vous pouvez également l'utiliser directement :

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

Remarque : vous ne devez jamais nommer explicitement les arguments de modèle d'un QStringTokenizer. Vous pouvez écrire QStringTokenizer{string, separator} (sans arguments modèles), ou utiliser QStringView::tokenize() ou QLatin1StringView::tokenize(), puis stocker la valeur de retour uniquement dans une variable auto:

auto result = strview.tokenize(sep);

En effet, les arguments modèles de QStringTokenizer dépendent très subtilement des types de chaînes et de séparateurs spécifiques à partir desquels ils sont construits, et ils ne correspondent généralement pas aux types réels transmis.

Séquences paresseuses

QStringTokenizer agit comme une séquence dite paresseuse, c'est-à-dire que chaque élément suivant n'est calculé que lorsque vous le demandez. Les séquences paresseuses ont l'avantage de ne nécessiter que O(1) de mémoire. Elles ont l'inconvénient, du moins pour QStringTokenizer, de n'autoriser que l'itération vers l'avant, et non l'itération par accès aléatoire.

Le cas d'utilisation prévu est qu'il suffit de l'insérer dans une boucle for ranged :

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

ou dans un algorithme C++20 :

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

Fin de la sentinelle

Les itérateurs de QStringTokenizer ne peuvent pas être utilisés avec des algorithmes STL classiques, car ceux-ci nécessitent des paires itérateur/itérateur, alors que QStringTokenizer utilise des sentinelles. En d'autres termes, il utilise un type différent, QStringTokenizer::sentinel, pour marquer la fin de la plage. Cela améliore les performances, car la sentinelle est un type vide. Les sentinelles sont prises en charge à partir de C++17 (pour les plages) et de C++20 (pour les algorithmes utilisant la nouvelle bibliothèque des plages).

Temporaires

QStringTokenizer est très soigneusement conçu pour éviter les références pendantes. Si vous construisez un tokenizer à partir d'une chaîne temporaire (une rvalue), cet argument est stocké en interne, de sorte que les données référencées ne sont pas supprimées avant d'être tokenisées :

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

Si vous passez des objets nommés (lvalues), QStringTokenizer ne stocke pas de copie. Vous êtes responsable de la conservation des données de l'objet nommé pendant toute la durée de l'opération du tokenizer :

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

Voir aussi QStringView::split(), QString::split(), et QRegularExpression.

Documentation sur les types de membres

[alias] QStringTokenizer::const_iterator

Ce typedef fournit un itérateur constant de style STL pour QStringTokenizer.

Voir aussi iterator.

[alias] QStringTokenizer::const_pointer

Alias pour value_type *.

[alias] QStringTokenizer::const_reference

Alias pour value_type &.

[alias] QStringTokenizer::difference_type

Alias de qsizetype.

[alias] QStringTokenizer::iterator

Ce typedef fournit un itérateur constant de style STL pour QStringTokenizer.

QStringTokenizer STL ne supporte pas les itérateurs mutables, donc c'est la même chose que const_iterator.

Voir également const_iterator.

[alias] QStringTokenizer::pointer

Alias de value_type *.

QStringTokenizer ne supporte pas les itérateurs mutables, c'est donc la même chose que const_pointer.

[alias] QStringTokenizer::reference

Alias pour value_type &.

QStringTokenizer ne supporte pas les références mutables, c'est donc la même chose que const_reference.

[alias] QStringTokenizer::sentinel

Ce type fournit une sentinelle de style STL pour QStringTokenizer::iterator et QStringTokenizer::const_iterator.

Voir aussi const_iterator.

[alias] QStringTokenizer::size_type

Alias de qsizetype.

[alias] QStringTokenizer::value_type

Alias pour const QStringView ou const QLatin1StringView, en fonction de l'argument du modèle Haystack du tokenizer.

Documentation des fonctions membres

[explicit constexpr noexcept(...)] QStringTokenizer::QStringTokenizer(Haystack haystack, Needle needle, Qt::CaseSensitivity cs, Qt::SplitBehavior sb = Qt::KeepEmptyParts)

[explicit constexpr noexcept(...)] QStringTokenizer::QStringTokenizer(Haystack haystack, Needle needle, Qt::SplitBehavior sb = Qt::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive)

Construit un tokenizer de chaîne qui divise la chaîne haystack en sous-chaînes à chaque fois que needle apparaît, et permet l'itération sur ces chaînes au fur et à mesure qu'elles sont trouvées. Si needle ne correspond à aucun élément de haystack, un seul élément contenant haystack est produit.

cs spécifie si needle doit être traité en tenant compte de la casse ou non.

Si sb est Qt::SkipEmptyParts, les entrées vides n'apparaissent pas dans le résultat. Par défaut, les entrées vides sont incluses.

Note : (1) est noexcept lorsque std::is_nothrow_copy_constructible<QStringTokenizer>::value est true.

Note : (2) est noexcept lorsque std::is_nothrow_copy_constructible<QStringTokenizer>::value est true.

Voir aussi QStringView::split(), QString::split(), Qt::CaseSensitivity, et Qt::SplitBehavior.

[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::begin() const

[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::cbegin() const

Renvoie un itérateur constant de style STL pointant sur le premier élément de la liste.

Voir aussi end() et cend().

[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::cend() const

Identique à end().

Voir également cbegin() et end().

[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::end() const

Renvoie une sentinelle constante de style STL pointant vers le jeton imaginaire situé après le dernier jeton de la liste.

Voir aussi begin() et cend().

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

Convertit la séquence paresseuse en un conteneur (typiquement) à accès aléatoire de type LContainer.

Cette fonction n'est disponible que si Container a un value_type correspondant à ce tokenizer value_type.

Si vous passez un conteneur nommé (une valeur l) pour c, alors ce conteneur est rempli et une référence à celui-ci est renvoyée. Si vous passez un conteneur temporaire (une rvalue, y compris l'argument par défaut), alors ce conteneur est rempli et retourné par sa valeur.

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

Cela vous donne un maximum de flexibilité dans la manière dont vous souhaitez stocker la séquence.

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

Convertit la séquence paresseuse en un conteneur (typiquement) à accès aléatoire de type RContainer.

En plus des contraintes de la surcharge lvalue-this, cette surcharge rvalue-this n'est disponible que si QStringTokenizer ne stocke pas la botte de foin en interne, car cela pourrait créer un conteneur plein de références pendantes :

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

Pour y remédier, stockez le site QStringTokenizer dans un répertoire temporaire :

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.

Vous pouvez forcer l'existence de cette fonction en lui passant une vue à la place :

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

Si vous passez un conteneur nommé (une lvalue) pour c, alors ce conteneur est rempli et une référence à celui-ci est renvoyée. Si vous passez un conteneur temporaire (une valeur r, y compris l'argument par défaut), ce conteneur est rempli et renvoyé par sa valeur.

Il s'agit d'une fonction surchargée.

Non-membres apparentés

[constexpr noexcept(...), since 6.0] template < typename Haystack, typename Needle, typename... Flags > auto qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)

Fonction d'usine pour un QStringTokenizer qui divise la chaîne haystack en sous-chaînes à chaque fois que needle apparaît, et permet l'itération sur ces chaînes au fur et à mesure qu'elles sont trouvées. Si needle ne correspond à aucun élément de haystack, un seul élément contenant haystack est produit.

Passez les valeurs des énumérateurs Qt::CaseSensitivity et Qt::SplitBehavior à flags pour modifier le comportement du tokenizer.

Cette fonction a été introduite dans Qt 6.0.

Remarque : Cette fonction est noexcept lorsque QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::value est true.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.