QStringTokenizer Class
template <typename Haystack, typename Needle> class QStringTokenizerLa clase QStringTokenizer divide cadenas en tokens a lo largo de separadores dados. Más...
| Cabecera: | #include <QStringTokenizer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core)target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Desde: | Qt 6.0 |
| Hereda de: | QtPrivate::Tok::HaystackPinning (privado), QtPrivate::Tok::NeedlePinning (privado), y |
- Lista de todos los miembros, incluyendo los heredados
- QStringTokenizer es parte de Clases para datos de cadena.
Nota: Todas las funciones de esta clase son reentrantes.
Tipos Públicos
| const_iterator | |
| const_pointer | |
| const_reference | |
| difference_type | |
| iterator | |
| pointer | |
| reference | |
| sentinel | |
| size_type | |
| value_type |
Funciones Públicas
| 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 && |
No Miembros Relacionados
(since 6.0) auto | qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags) |
Descripción Detallada
Divide una cadena en subcadenas dondequiera que aparezca un separador dado, devolviendo una lista (perezosamente construida) de esas cadenas. Si el separador no coincide en ninguna parte de la cadena, produce una lista de un solo elemento que contiene esta cadena. Si el separador está vacío, QStringTokenizer produce una cadena vacía, seguida de cada uno de los caracteres de la cadena, seguidos de otra cadena vacía. Las dos enumeraciones Qt::SplitBehavior y Qt::CaseSensitivity controlan aún más la salida.
QStringTokenizer maneja QStringView::tokenize(), pero también puedes usarlo directamente:
for (auto it : QStringTokenizer{string, separator}) use(*it);
Nota: Nunca debes nombrar explícitamente los argumentos de plantilla de un QStringTokenizer. Puede escribir QStringTokenizer{string, separator} (sin argumentos de plantilla), o usar QStringView::tokenize() o QLatin1StringView::tokenize(), y luego almacenar el valor de retorno sólo en una variable auto:
auto result = strview.tokenize(sep);
Esto se debe a que los argumentos de plantilla de QStringTokenizer tienen una dependencia muy sutil de los tipos específicos de cadena y separador con los que se construyen, y normalmente no se corresponden con los tipos reales pasados.
Secuencias perezosas
QStringTokenizer actúa como una secuencia perezosa, es decir, cada elemento siguiente sólo se calcula una vez que se solicita. Las secuencias perezosas tienen la ventaja de que sólo requieren O(1) de memoria. Tienen la desventaja de que, al menos para QStringTokenizer, sólo permiten iteración hacia adelante, no de acceso aleatorio.
El caso de uso previsto es que usted acaba de conectarlo a un ranged for loop:
for (auto it : QStringTokenizer{string, separator}) use(*it);
o un algoritmo de rango C++20:
std::ranges::for_each(QStringTokenizer{string, separator}, [] (auto token) { use(token); });
Fin Sentinel
Los iteradores de QStringTokenizer no pueden usarse con algoritmos STL clásicos, porque requieren pares iterador/iterador, mientras que QStringTokenizer usa centinelas. Es decir, utiliza un tipo diferente, QStringTokenizer::sentinel, para marcar el final del rango. Esto mejora el rendimiento, porque el centinela es un tipo vacío. Los centinelas están soportados desde C++17 (para ranged for) y C++20 (para algoritmos que utilizan la nueva librería ranges).
Temporales
QStringTokenizer está cuidadosamente diseñado para evitar referencias colgantes. Si construyes un tokenizador a partir de una cadena temporal (un rvalue), ese argumento se almacena internamente, por lo que los datos referenciados no se borran antes de ser tokenizados:
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 pasa objetos con nombre (lvalues), QStringTokenizer no almacena una copia. Usted es responsable de mantener los datos del objeto nombrado por más tiempo que el tokenizador opere sobre ellos:
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);
Ver también QStringView::split(), QString::split(), y QRegularExpression.
Documentación de tipos de miembros
[alias] QStringTokenizer::const_iterator
Este tippedef proporciona un iterador const de estilo STL para QStringTokenizer.
Véase también iterator.
[alias] QStringTokenizer::const_pointer
Alias para value_type *.
[alias] QStringTokenizer::const_reference
Alias para value_type &.
[alias] QStringTokenizer::difference_type
Alias para qsizetype.
[alias] QStringTokenizer::iterator
Este typedef proporciona un iterador const de estilo STL para QStringTokenizer.
QStringTokenizer no admite iteradores mutables, por lo que es lo mismo que const_iterator.
Véase también const_iterator.
[alias] QStringTokenizer::pointer
Alias para value_type *.
QStringTokenizer no admite iteradores mutables, por lo que es igual que const_pointer.
[alias] QStringTokenizer::reference
Alias para value_type &.
QStringTokenizer no admite referencias mutables, por lo que es igual que const_reference.
[alias] QStringTokenizer::sentinel
Este typedef proporciona un centinela de estilo STL para QStringTokenizer::iterator y QStringTokenizer::const_iterator.
Véase también const_iterator.
[alias] QStringTokenizer::size_type
Alias para qsizetype.
[alias] QStringTokenizer::value_type
Alias para const QStringView o const QLatin1StringView, dependiendo del argumento de plantilla Haystack del tokenizador.
Documentación de las funciones miembro
[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)
Construye un tokenizador de cadenas que divide la cadena haystack en subcadenas dondequiera que aparezca needle, y permite iterar sobre esas cadenas a medida que se encuentran. Si needle no coincide en ninguna parte con haystack, se produce un único elemento que contiene haystack.
cs especifica si needle debe coincidir con mayúsculas o minúsculas.
Si sb es Qt::SkipEmptyParts, las entradas vacías no aparecen en el resultado. Por defecto, se incluyen las entradas vacías.
Nota: (1) es noexcept cuando std::is_nothrow_copy_constructible<QStringTokenizer>::value es true.
Nota: (2) es noexcept cuando std::is_nothrow_copy_constructible<QStringTokenizer>::value es true.
Véase también QStringView::split(), QString::split(), Qt::CaseSensitivity, y Qt::SplitBehavior.
[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::begin() const
[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::cbegin() const
Devuelve un iterador const de estilo STL que apunta al primer token de la lista.
[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::cend() const
Igual que end().
Véase también cbegin() y end().
[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::end() const
Devuelve un centinela const de estilo STL que apunta al token imaginario después del último token de la lista.
Véase también begin() y cend().
template <typename LContainer> LContainer QStringTokenizer::toContainer(LContainer &&c = {}) const &
Convierte la secuencia perezosa en un contenedor (típicamente) de acceso aleatorio de tipo LContainer.
Esta función sólo está disponible si Container tiene un value_type que coincida con el value_type de este tokenizador.
Si pasas un contenedor con nombre (un lvalue) para c, entonces ese contenedor se llena, y se devuelve una referencia a él. Si se pasa un contenedor temporal (un rvalue, incluido el argumento por defecto), entonces ese contenedor se llena y se devuelve por valor.
// 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);
Esto le da la máxima flexibilidad en cómo desea que se almacene la secuencia.
template <typename RContainer> RContainer QStringTokenizer::toContainer(RContainer &&c = {}) const &&
Convierte la secuencia perezosa en un contenedor (típicamente) de acceso aleatorio del tipo RContainer.
Además de las restricciones de la sobrecarga lvalue-this, esta sobrecarga rvalue-this sólo está disponible cuando este QStringTokenizer no almacena el pajar internamente, ya que esto podría crear un contenedor lleno de referencias colgantes:
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
Para solucionarlo, almacene el QStringTokenizer en un temporal:
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.
Puede forzar la existencia de esta función pasando una vista en su lugar:
func(QStringTokenizer{QStringView{widget.text()}, u','}.toContainer()); // OK: compiler keeps widget.text() around until after func() has executed
Si pasas un contenedor con nombre (un lvalue)para c, entonces ese contenedor se llena, y se devuelve una referencia a él. Si pasa un contenedor temporal (un rvalue, incluido el argumento por defecto), entonces ese contenedor se llena, y se devuelve por valor.
Se trata de una función sobrecargada.
No miembros relacionados
[constexpr noexcept(...), since 6.0] template <
typename Haystack,
typename Needle,
typename... Flags
>
auto qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)
Función de fábrica para QStringTokenizer que divide la cadena haystack en subcadenas dondequiera que aparezca needle, y permite la iteración sobre esas cadenas a medida que se encuentran. Si needle no coincide en ninguna parte de haystack, se produce un único elemento que contiene haystack.
Pase valores de los enumeradores Qt::CaseSensitivity y Qt::SplitBehavior como flags para modificar el comportamiento del tokenizador.
Esta función se introdujo en Qt 6.0.
Nota: Esta función es noexcept cuando QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::value es 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.