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 |
Since: | Qt 6.0 |
Inherits: | QtPrivate::Tok::HaystackPinning (private), QtPrivate::Tok::NeedlePinning (private), and |
- 継承メンバを含むすべてのメンバの一覧
- 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 の 2 つの列挙は、さらに出力を制御します。
QStringTokenizer はQStringView::tokenize() を駆動しますが、これを直接使用することもできます:
for (auto it : QStringTokenizer{string, separator}) use(*it);
注意: QStringTokenizerのテンプレート引数に明示的に名前を付けてはいけません。QStringTokenizer{string, separator}
(テンプレート引数なし)を書くか、qTokenize ()関数、QStringView::split ()またはQLatin1StringView::split()メンバ関数を使用し、返り値のみをauto
変数に格納することができます:
auto result = string.split(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 はセンチネルを使用します。つまり、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);
名前付きオブジェクト (lvalue) を渡した場合、QStringTokenizer はコピーを保存しません。名前付きオブジェクト (lvalue) を渡す場合、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 スタイルの const イテレータを提供する.
iteratorも参照 .
[alias]
QStringTokenizer::const_pointer
value_type *
のエイリアス.
[alias]
QStringTokenizer::const_reference
value_type &
のエイリアス.
[alias]
QStringTokenizer::difference_type
qsizetype のエイリアス.
[alias]
QStringTokenizer::iterator
この型定義は,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
この型定義は,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 の場合、空のエントリは結果に現れない。デフォルトでは、空のエントリが含まれる。
注意: (1)は、"std::is_nothrow_copy_constructible<QStringTokenizer>::value" が真の場合、例外をスローしません。
( 2) "std::is_nothrow_copy_constructible<QStringTokenizer>::value "が真でも例外をスローしない。
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
リストの最後のトークンの後の虚数トークンを指す constSTL 形式のセンチネルを返します。
template <typename LContainer> LContainer QStringTokenizer::toContainer(LContainer &&c = {}) const &
遅延シーケンスをLContainer
型の(通常)ランダムアクセスコンテナに変換する。
この関数は、Container
が、このトークナイザのvalue_type と一致するvalue_type
を持っている場合にのみ利用可能です。
c に名前付きコンテナ(l値)を渡すと、そのコンテナが満たされ、そのコンテナへの参照が返される。一時的なコンテナ(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 が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 に名前付きコンテナ(l値)を渡すと、そのコンテナが満たされ、そのコンテナへの参照が返される。一時的なコンテナ(r値、デフォルト引数を含む)を渡すと、そのコンテナが満たされ、値が返される。
関連する非会員
[constexpr noexcept(...), since 6.0]
template <typename Haystack, typename Needle, typename... Flags> auto qTokenize(Haystack &&haystack, Needle &&needle, Flags... flags)
文字列haystack を、needle が出現するあらゆる場所で部分文字列に分割し、それらの文字列が見つかったときに、それらの文字列を反復処理できるようにするQStringTokenizer のファクトリ関数。needle がhaystack のどこにもマッチしない場合、haystack を含む単一要素が生成される。
Qt::CaseSensitivity とQt::SplitBehavior の列挙子からflags として値を渡して、トークナイザーの動作を変更します。
この関数は Qt 6.0 で導入されました。
注意: この関数は、"QtPrivate::Tok::is_nothrow_constructible_from<Haystack, Needle>::value" が true の場合、例外をスローしません。
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権はそれぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。