basic_string_view

basic_string_view (문자열 뷰)

이 페이지에서는 C++17에서 도입된 std::basic_string_view 클래스 템플릿에 대해 설명해요. basic_string_view는 소유권 없이 연속된 문자 시퀀스를 참조하는 뷰로, 문자열 리터럴이나 std::string 등의 데이터를 복사하지 않고 읽을 수 있게 해줘요. 이 레퍼런스는 생성, 멤버 함수, 비멤버 함수, 리터럴, 헬퍼 클래스 등을 다루고 있어요.

출처: cppreference

본문

정의

<string_view> 헤더에 정의되어 있어요.

Defined in header <string_view>
template < class CharT , class Traits = std :: char_traits < CharT > > class basic_string_view ; (since C++17)

클래스 템플릿 basic_string_view는 첫 번째 요소가 위치 0에 있는 상수 연속 문자 시퀀스 CharT를 참조할 수 있는 객체를 나타내요.

basic_string_view str에 대해, str의 요소를 가리키는 포인터, 반복자, 참조자는 [ str . data () , str . data () + str . size () ) 범위의 포인터를 무효화하는 연산이 수행되면 함께 무효화돼요.

Every specialization of std::basic_string_view is a TriviallyCopyable type. (since C++23)

일반적인 문자 타입에 대한 여러 typedef가 제공돼요.

Defined in header <string_view>
Type
std::string_view (C++17)
std::wstring_view (C++17)
std::u8string_view (C++20)
std::u16string_view (C++17)
std::u32string_view (C++17)

템플릿 매개변수

CharT - 문자 타입이에요.
Traits - 문자 타입에 대한 연산을 정의하는 CharTraits 클래스예요. std::basic_string과 마찬가지로 Traits::char_typeCharT와 동일한 타입을 가리켜야 하며, 그렇지 않으면 프로그램이 ill-formed가 돼요.

중첩 타입

Type Definition
traits_type Traits
value_type CharT
pointer CharT *
const_pointer const CharT *
reference CharT &
const_reference const CharT &
const_iterator 구현 정의된 상수 LegacyRandomAccessIteratorLegacyContiguousIterator (until C++20) ConstexprIteratorcontiguous_iterator (since C++20)이며 value_typeCharT예요.
iterator const_iterator
const_reverse_iterator std :: reverse_iterator < const_iterator >
reverse_iterator const_reverse_iterator
size_type std::size_t
difference_type std::ptrdiff_t

참고: iteratorconst_iterator는 문자열 뷰가 상수 문자 시퀀스를 참조하는 뷰이므로 동일한 타입이에요.

Container의 반복자 타입에 대한 모든 요구 사항은 basic_string_viewiteratorconst_iterator 타입에도 동일하게 적용돼요.

데이터 멤버

Member Description
const_pointer data_ 기본 시퀀스를 가리키는 포인터 ( exposition-only member object )
size_type size_ 문자 수 ( exposition-only member object )

멤버 함수

생성자와 대입
(constructor)
operator=
반복자
begin cbegin
end cend
rbegin crbegin
rend crend
요소 접근
operator[]
at
front
back
data
용량
size length
max_size
empty
수정자
remove_prefix
remove_suffix
swap
연산
copy
substr
subview (C++26)
compare
starts_with (C++20)
ends_with (C++20)
contains (C++23)
find
rfind
find_first_of
find_last_of
find_first_not_of
find_last_not_of
상수
npos [static]

비멤버 함수

operator== operator!= operator< operator> operator<= operator>= operator<=> (C++17) (removed in C++20) (removed in C++20) (removed in C++20) (removed in C++20) (removed in C++20) (C++20) 두 문자열 뷰를 사전식으로 비교해요 (function template)
입출력
operator<< (C++17) 문자열 뷰에 대해 스트림 출력을 수행해요 (function template)

리터럴

Defined in inline namespace std::literals::string_view_literals
operator""sv (C++17)

헬퍼 클래스

std::hash <std::string_view> std::hash <std::wstring_view> std::hash <std::u8string_view> std::hash <std::u16string_view> std::hash <std::u32string_view> (C++17) (C++17) (C++20) (C++17) (C++17) 문자열 뷰에 대한 해시 지원이에요 (class template specialization)

헬퍼 템플릿

template < class CharT , class Traits > inline constexpr bool ranges :: enable_borrowed_range < std :: basic_string_view < CharT , Traits >> = true ; (since C++20)

ranges::enable_borrowed_range 특수화는 basic_string_viewborrowed_range를 만족하도록 해요.

template < class CharT , class Traits > inline constexpr bool ranges :: enable_view < std :: basic_string_view < CharT , Traits >> = true ; (since C++20)

ranges::enable_view 특수화는 basic_string_viewview를 만족하도록 해요.

Deduction guides (since C++20)

참고 사항

std::string_view가 가리키는 문자 배열보다 오래 살아남지 않도록 하는 것은 프로그래머의 책임이에요.

std::string_view good{"a string literal"};
    // "Good" case: `good` points to a static array.
    // String literals reside in persistent data storage.

std::string_view bad{"a temporary string"s};
    // "Bad" case: `bad` holds a dangling pointer since the std::string temporary,
    // created by std::operator""s, will be destroyed at the end of the statement.

std::basic_string_view의 특수화는 C++23에서 공식 요구 사항으로 도입되기 전부터 이미 모든 기존 구현에서 trivially copyable 타입이었어요.

Feature-test macro Value Std Feature
__cpp_lib_string_view 201606L (C++17) std::string_view
201803L (C++20) ConstexprIterator
__cpp_lib_string_contains 202011L (C++23) contains

예제

#include <iostream>
#include <string_view>

int main()
{
    #define A "▀"
    #define B "▄"
    #define C "─"

    constexpr std::string_view blocks[]{A B C, B A C, A C B, B C A};

    for (int y{}, p{}; y != 8; ++y, p = ((p + 1) % 4))
    {
        for (char x{}; x != 29; ++x)
            std::cout << blocks[p];
        std::cout << '\n';
    }
}

출력:

▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─
▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─
▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄
▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀
▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─
▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─
▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄▀─▄
▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀▄─▀

결함 보고서

다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었어요.

DR Applied to Behavior as published Correct behavior
LWG 3203 C++17 basic_string_view의 멤버 함수에서 반환된 포인터, 반복자, 참조자만 무효화될 수 있음 basic_string_view의 요소를 가리키는 모든 포인터, 반복자, 참조자가 무효화될 수 있음

같이 보기

basic_string 문자 시퀀스를 저장하고 조작해요 (class template)
operator+ 두 문자열, 문자열과 문자, 또는 문자열과 string_view를 연결해요 (function template)
span (C++20) 연속된 객체 시퀀스에 대한 비소유 뷰예요 (class template)
initializer_list (C++11) list-initialization에서 생성된 임시 배열을 참조해요 (class template)

더 알아보기 (Learn more)

cppreference