이 페이지에서

QStringTokenizer Class

template <typename Haystack, typename Needle> class QStringTokenizer

QStringTokenizer 클래스는 지정된 구분 기호를 기준으로 문자열을 토큰으로 분할합니다. 더 보기...

헤더: #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(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는 소위 ‘지연 시퀀스(lazy sequence)’로 작동합니다. 즉, 다음 요소는 요청이 있을 때만 계산됩니다. 지연 시퀀스는 O(1)의 메모리만 필요하다는 장점이 있습니다. 반면, 적어도 QStringTokenizer의 경우 무작위 접근(random-access) 반복은 허용하지 않고 순차적 반복만 가능하다는 단점이 있습니다.

이 클래스의 주요 사용 사례는 범위를 지정하는 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는 매달린 참조(dangling reference)를 피하기 위해 매우 신중하게 설계되었습니다. 임시 문자열(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는 사본을 저장하지 않습니다. 토큰화기가 해당 객체를 처리하는 기간보다 더 오랫동안 명명된 객체의 데이터를 유지하는 것은 사용자의 책임입니다:

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

토큰화기의 ` Haystack ` 템플릿 인자에 따라 ` const QStringView ` 또는 ` const QLatin1StringView`의 별칭입니다.

멤버 함수 문서

[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 스타일의 const 이터레이터를 반환합니다.

end() 및 cend()도 참조하십시오 .

[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::cend() const

end()와 동일합니다.

cbegin() 및 end()도 참조하십시오 .

[constexpr noexcept] QStringTokenizer<Haystack, Needle>::sentinel QStringTokenizer::end() const

목록의 마지막 토큰 다음에 오는 가상의 토큰을 가리키는 STL 스타일의 const 센티넬 을 반환합니다.

begin() 및 cend()도 참조하십시오 .

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

지연 시퀀스를 (일반적으로) ` LContainer` 유형의 임의 접근 컨테이너로 변환합니다.

이 함수는 ` Container `에 이 토큰화기의 ` value_type`와 일치하는 ` value_type `가 있는 경우에만 사용할 수 있습니다.

c 에 대해 이름이 지정된 컨테이너(lvalue)를 전달하면 해당 컨테이너가 채워지고, 이에 대한 참조가 반환됩니다. 임시 컨테이너(rvalue, 기본 인자 포함)를 전달하면 해당 컨테이너가 채워지고, 값으로 반환됩니다.

// 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 에 이름이 지정된 컨테이너(lvalue)를 전달하면, 해당 컨테이너가 채워지고 이에 대한 참조가 반환됩니다. 임시 컨테이너(rvalue, 기본 인자 포함)를 전달하면, 해당 컨테이너가 채워지고 값으로 반환됩니다.

이 함수는 오버로드된 함수입니다.

관련 비멤버 함수

[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.