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_type은 CharT와 동일한 타입을 가리켜야 하며, 그렇지 않으면 프로그램이 ill-formed가 돼요. |
중첩 타입
| Type |
Definition |
traits_type |
Traits |
value_type |
CharT |
pointer |
CharT * |
const_pointer |
const CharT * |
reference |
CharT & |
const_reference |
const CharT & |
const_iterator |
구현 정의된 상수 LegacyRandomAccessIterator 및 LegacyContiguousIterator (until C++20) ConstexprIterator 및 contiguous_iterator (since C++20)이며 value_type은 CharT예요. |
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 |
참고: iterator와 const_iterator는 문자열 뷰가 상수 문자 시퀀스를 참조하는 뷰이므로 동일한 타입이에요.
Container의 반복자 타입에 대한 모든 요구 사항은 basic_string_view의 iterator 및 const_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_view가 borrowed_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_view가 view를 만족하도록 해요.
| 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