QStringTokenizer Class
template <typename Haystack, typename Needle> class QStringTokenizerQStringTokenizer 类按照给定的分隔符将字符串分割成标记。更多
Header: | #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 (private), QtPrivate::Tok::NeedlePinning (private), 以及 |
- 所有成员的列表,包括继承成员
- 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 会产生一个空字符串,然后是字符串中的每个字符,最后是另一个空字符串。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 采用所谓的懒序列(lazy sequence),也就是说,每个下一个元素只有在你要求时才会被计算。懒序列的优点是只需要 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(适用于范围)和 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
该类型定义为QStringTokenizer 提供了 STL 风格的常量迭代器。
另请参见 iterator 。
[alias]
QStringTokenizer::const_pointer
value_type *
的别名 。
[alias]
QStringTokenizer::const_reference
value_type &
的别名 。
[alias]
QStringTokenizer::difference_type
qsizetype 的别名。
[alias]
QStringTokenizer::iterator
该类型定义为QStringTokenizer 提供了 STL 风格的常量迭代器。
QStringTokenizer 迭代器不支持可变迭代器,因此它与 相同。const_iterator
另请参见 const_iterator 。
[alias]
QStringTokenizer::pointer
value_type *
的别名。
QStringTokenizer 不支持可变迭代器,因此与 相同。const_pointer
[alias]
QStringTokenizer::reference
value_type &
.NET 的别名。
QStringTokenizer 不支持可变引用,因此与 相同。const_reference
[alias]
QStringTokenizer::sentinel
该类型定义为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
返回指向列表中第一个标记的 ConstSTL 样式迭代器。
[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 传递了一个命名容器(lvalue),那么该容器将被填充,并返回对它的引用。如果传入一个临时容器(r 值,包括默认参数),则该容器将被填充,并按值返回。
// 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
如果你为c 传递了一个命名的容器(lvalue),那么该容器就会被填满,并返回对它的引用。如果传递的是临时容器(r 值,包括默认参数),则该容器将被填充,并以值返回。
相关非成员
[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。
© 2025 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.