QStringTokenizer Class
template <typename Haystack, typename Needle> class QStringTokenizerQStringTokenizer 类会根据给定的分隔符将字符串拆分为令牌。更多内容...
| 头文件: | #include <QStringTokenizer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 自: | Qt 6.0 |
| 继承自: | QtPrivate::Tok::HaystackPinning(私有)、QtPrivate::Tok::NeedlePinning(私有)以及 |
- 所有成员列表(包括继承的成员)
- QStringTokenizer 属于字符串数据类。
注意:该类中的所有函数均为可重入函数。
公共类型
| const_iterator | |
| const_pointer | |
| const_reference | |
| difference_type | |
| iterator | |
| pointer | |
| reference | |
| sentinel | |
| size_type | |
| value_type |
公共函数
| 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) |
详细说明
QStringTokenizer<Haystack, Needle> 是一个模板类,其中Haystack 是待切分字符串的类型,Needle 是分隔符的类型。实际上,您通常无需显式指定这些模板参数;它们会由编译器自动推导出来。
在给定分隔符出现的位置将字符串拆分为子字符串,并返回这些子字符串的(懒加载构建的)列表。 如果分隔符在字符串中任何位置都不匹配,则生成一个包含该字符串的单元素列表。如果分隔符为空,QStringTokenizer 将生成一个空字符串,随后是该字符串的每个字符,最后再跟一个空字符串。两个枚举Qt::SplitBehavior 和Qt::CaseSensitivity 进一步控制输出。
QStringTokenizer 会调用QStringView::tokenize(),但您也可以直接使用它:
for (auto it : QStringTokenizer{string, separator})
use(*it);注意:切勿 显式指定 QStringTokenizer 的模板参数名称。您可以编写QStringTokenizer{string, separator} (不带模板参数),或使用QStringView::tokenize() 或QLatin1StringView::tokenize(),随后仅将返回值存储在auto 变量中:
auto result = strview.tokenize(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);如果您传递命名对象(左值),则 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 为 `QStringTokenizer` 提供了一个 STL 风格的 const 迭代器。
另请参阅 iterator 。
[alias] QStringTokenizer::const_pointer
value_type * 的别名。
[alias] QStringTokenizer::const_reference
value_type & 的别名。
[alias] QStringTokenizer::difference_type
qsizetype 的别名。
[alias] QStringTokenizer::iterator
此 typedef 为QStringTokenizer 提供了一个 STL 风格的 const 迭代器。
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 为 `QStringTokenizer::iterator ` 和 `QStringTokenizer::const_iterator` 提供了 STL 风格的哨兵。
另请参阅 const_iterator 。
[alias] QStringTokenizer::size_type
qsizetype 的别名。
[alias] QStringTokenizer::value_type
const QStringView 或const QLatin1StringView 的别名,具体取决于分词器的Haystack 模板参数。
成员函数文档
[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)
构建一个字符串分词器,该分词器会在字符串haystack 中每次出现needle 时将其拆分为子字符串,并允许在找到这些子字符串时对其进行迭代。如果needle 在haystack 中任何位置均未匹配,则生成一个包含haystack 的单个元素。
cs 指定needle 的匹配应区分大小写还是不区分大小写。
如果sb 为Qt::SkipEmptyParts ,则结果中不会出现空条目。默认情况下,结果中包含空条目。
注意: 当 `std::is_nothrow_copy_constructible<QStringTokenizer>::value ` 为 `true` 时,( 1) 为 `noexcept`。
注: 当std::is_nothrow_copy_constructible<QStringTokenizer>::value 为true 时,( 2) 为 noexcept。
另请参阅 QStringView::split()、QString::split()、Qt::CaseSensitivity 以及Qt::SplitBehavior 。
[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::begin() const
[noexcept] QStringTokenizer<Haystack, Needle>::iterator QStringTokenizer::cbegin() const
返回一个指向列表中第一个令牌的常量STL 风格迭代器。
[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::cend() const
与end() 相同。
[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::end() const
返回一个指向列表中最后一个令牌之后的虚拟令牌的、STL 风格的常量哨兵指针。
template <typename LContainer> LContainer QStringTokenizer::toContainer(LContainer &&c = {}) const &
将懒加载序列转换为类型为LContainer 的(通常是)随机访问容器。
只有当Container 具有与该标记器的value_type 匹配的value_type 时,此函数才可用。
若为c 传入一个命名容器(左值),则该容器将被填充,并返回对其的引用。若传入一个临时容器(右值,包括默认参数),则该容器将被填充,并按值返回。
// 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若将命名容器(左值)作为 `c` 的参数传入,则该容器会被填充,并返回对其的引用;若传入临时容器(右值,包括默认参数),则该容器会被填充,并按值返回。
这是一个重载函数。
相关的非成员函数
[constexpr noexcept(...), since 6.0] template <
typename Haystack,
typename Needle,
typename... Flags
>
auto qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)
QStringTokenizer 的工厂函数,该函数会在字符串haystack 中每次出现needle 时将其拆分为子字符串,并允许在找到这些字符串时对其进行迭代。如果needle 在haystack 中任何位置均不匹配,则生成一个包含haystack 的单个元素。
将Qt::CaseSensitivity 和Qt::SplitBehavior 枚举器的值作为flags 传递,以修改标记器的行为。
该函数自 Qt 6.0 起引入。
注意: 当QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::value 为true 时,此 函数为 noexcept。
© 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.