Sur cette page

QStringTokenizer Class

template <typename Haystack, typename Needle> class QStringTokenizer

La classe QStringTokenizer divise les chaînes de caractères en tokens à l'aide des séparateurs indiqués. En savoir plus...

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 (privé), QtPrivate::Tok::NeedlePinning (privé) et

Remarque : 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

QStringTokenizer<Haystack, Needle> est une classe de modèle où Haystack correspond au type de la chaîne à tokeniser et Needle au type du séparateur. En pratique, vous ne devriez jamais avoir besoin de spécifier explicitement ces arguments de modèle ; ils sont déduits automatiquement par le compilateur.

Divise une chaîne en sous-chaînes à chaque occurrence d’un séparateur donné, et renvoie une liste (construite de manière différée) de ces sous-chaînes. Si le séparateur ne correspond à aucun élément de la chaîne, il 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 le résultat.

QStringTokenizer utilise 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 de modèle), ou utiliser soit QStringView::tokenize(), soit QLatin1StringView::tokenize(), puis stocker la valeur de retour uniquement dans une variable de type auto:

auto result = strview.tokenize(sep);

En effet, les arguments de modèle de QStringTokenizer présentent une dépendance très subtile vis-à-vis des types spécifiques de chaînes et de séparateurs à partir desquels ils sont construits, et ils ne correspondent généralement pas aux types réels passés en paramètre.

Séquences paresseuses

QStringTokenizer se comporte comme ce qu’on appelle une « séquence paresseuse », c’est-à-dire que chaque élément suivant n’est calculé qu’au moment où vous le demandez. Les séquences paresseuses présentent l’avantage de ne nécessiter qu’O(1) de mémoire. Elles ont pour inconvénient, du moins dans le cas de QStringTokenizer, de ne permettre qu’une itération vers l’avant, et non un accès aléatoire.

Le cas d'utilisation prévu consiste simplement à l'intégrer dans une boucle « for » avec une plage :

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

ou dans un algorithme de plage C++20 :

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

Sentinelle de fin

Les itérateurs de QStringTokenizer ne peuvent pas être utilisés avec les algorithmes STL classiques, car ceux-ci requièrent des paires itérateur/itérateur, tandis que QStringTokenizer utilise des sentinelles. Autrement dit, 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 boucles « for » sur des plages) et de C++20 (pour les algorithmes utilisant la nouvelle bibliothèque de plages).

Variables temporaires

QStringTokenizer est conçu avec le plus grand soin pour éviter les références pendantes. Si vous créez 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 (l-values), QStringTokenizer n’en stocke pas de copie. Il vous incombe de conserver les données de l’objet nommé plus longtemps que la durée pendant laquelle le tokenizer les traite :

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 également QStringView::split(), QString::split() et QRegularExpression.

Documentation sur les types de membres

[alias] QStringTokenizer::const_iterator

Ce `typedef` fournit un itérateur `const` de type STL pour ` QStringTokenizer`.

Voir également iterator.

[alias] QStringTokenizer::const_pointer

Alias pour value_type *.

[alias] QStringTokenizer::const_reference

Alias de value_type &.

[alias] QStringTokenizer::difference_type

Alias de « qsizetype ».

[alias] QStringTokenizer::iterator

Ce `typedef` fournit un itérateur `const` de type STL pour ` QStringTokenizer`.

QStringTokenizer ne prend pas en charge les itérateurs mutables ; cela revient donc au même que const_iterator.

Voir également const_iterator.

[alias] QStringTokenizer::pointer

Alias de value_type *.

QStringTokenizer ne prend pas en charge les itérateurs modifiables ; cette fonction est donc identique à const_pointer.

[alias] QStringTokenizer::reference

Alias de value_type &.

QStringTokenizer ne prend pas en charge les références mutables ; cela revient donc à utiliser const_reference.

[alias] QStringTokenizer::sentinel

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

Voir également const_iterator.

[alias] QStringTokenizer::size_type

Alias de « qsizetype ».

[alias] QStringTokenizer::value_type

Alias pour const QStringView ou const QLatin1StringView, selon la valeur de l'argument de 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)

Crée un tokeniseur de chaînes qui divise la chaîne haystack en sous-chaînes partout où apparaît needle, et permet de parcourir ces chaînes au fur et à mesure qu'elles sont trouvées. Si needle ne correspond à aucun endroit dans haystack, un seul élément contenant haystack est généré.

cs Spécifie si la recherche de needle doit être sensible à 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.

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

Remarque : ( 2) est « noexcept » lorsque ` std::is_nothrow_copy_constructible<QStringTokenizer>::value ` est ` true`.

Voir également 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 de type STL (const) pointant vers le premier élément de la liste.

Voir également 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 de type STL (const) pointant vers le token imaginaire situé après le dernier token de la liste.

Voir également ` begin()` et ` cend()`.

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

Convertit la séquence « paresseuse » en un conteneur (généralement) à accès aléatoire de type LContainer.

Cette fonction n’est disponible que si Container dispose d’un value_type correspondant à l’ value_type de ce tokenizer.

Si vous passez un conteneur nommé (une l-valeur) pour ` c`, ce conteneur est rempli et une référence à celui-ci est renvoyée. Si vous passez un conteneur temporaire (une r-valeur, y compris l’argument par défaut), ce conteneur est rempli et renvoyé par 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 offre une flexibilité maximale quant à la manière dont vous souhaitez que la séquence soit stockée.

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

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

Outre les contraintes liées à la surcharge « lvalue-this », cette surcharge « rvalue-this » n’est disponible que lorsque cet ` QStringTokenizer ` ne stocke pas le `haystack` en interne, car cela pourrait créer un conteneur rempli 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 l’ QStringTokenizer dans une variable 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’appel 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) à ` 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 renvoyé par valeur.

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

Éléments non membres associé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 objet ` QStringTokenizer ` qui divise la chaîne ` haystack ` en sous-chaînes à chaque occurrence de ` needle `, et permet de parcourir 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 généré.

Transmettez les valeurs des énumérateurs Qt::CaseSensitivity et Qt::SplitBehavior en tant que flags pour modifier le comportement du tokenizer.

Cette fonction a été introduite dans Qt 6.0.

Remarque : cette fonction est de type « noexcept » lorsque QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::value est égal à 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.