2 분 소요

  • (C++17~) string_view가 추가되어 문자열을 읽기 전용으로 사용할 때 불필요한 문자열 복제가 없도록 해줍니다.
  • (C++20~) u8string_view가 추가되었습니다.

개요

문자열에 대한 읽기만 필요한 함수가 있는 경우 string이나 const char*로 전달받을 수 있는데요, 둘다 문제가 좀 있습니다.

  1. 인자string을 사용한 경우 : 암시적으로 string개체가 생성됩니다.

    1
    2
    3
    4
    5
    6
    7
    
     std::size_t Func(const std::string& str) {return str.length();}
    
     std::string str1{"Hello"};
     const char* str2{"World"};
    
     EXPECT_TRUE(Func(str1) == 5);
     EXPECT_TRUE(Func(str2) == 5); // (△) 비권장. 암시적으로 string 개체가 생성됩니다.
    
  2. 인자const char*를 사용한 경우 : 널종료 문자열을 강제로 만들어야 합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
     std::size_t Func(const char* str) {
         std::size_t i{0};
         while(str[i] != '\0') {
             ++i;
         } 
         return i;
     }
    
     std::string str1{"Hello"};
     const char* str2{"World"};
    
     EXPECT_TRUE(Func(str1.c_str()) == 5); // (△) 비권장. 널종료 문자열을 만듭니다.
     EXPECT_TRUE(Func(str2) == 5); // (△) 비권장. 문자열의 길이는 매번 다시 '\0'까지 카운팅해야 합니다.
    

C++17 부터는 string_view가 추가되어 문자열을 읽기 전용으로 사용할 때 불필요한 문자열 복제가 없도록 해줍니다.

내부적으로 string이나 const char*를 참조만 하여 메모리 낭비를 없애고, 읽기 전용 함수들만 제공하여 string 관련 편의 기능들을 그대로 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
std::size_t Func(std::string_view sv) {
    return sv.length();
}

std::string str1{"Hello"};
const char* str2{"World"};

EXPECT_TRUE(Func(str1) == 5); // (O) 불필요하게 string 개체를 생성하지 않습니다.
EXPECT_TRUE(Func(str2) == 5); // (O) 불필요하게 string 개체를 생성하지 않습니다.

basic_string처럼 기본 클래스는 basic_string_view 이며, 처리하는 문자 타입에 따라 재정의한 string_view, wstring_view등을 사용합니다.

항목 내용
string_view (C++17~) basic_string_view<char>
wstring_view (C++17~) basic_string_view<wchar_t>
u16string_view (C++17~) basic_string_view<char16_t>
u32string_view (C++17~) basic_string_view<char32_t>
u8string_view (C++20~) basic_string_view<char16_t>

생성자

항목 내용
basic_string_view() (C++17~) string_view 개체를 생성합니다.
basic_string_view(const basic_string_view& other) (C++17~) 복사 생성합니다. 이때 내부 관리 문자열은 참조만 하고 복제하지는 않습니다.
basic_string_view(const value_type* ptr) (C++17~) C 언어 스타일의 문자열을 참조합니다.
basic_string_view(const value_type* ptr, size_type count) (C++17~) count길이(널문자(정수 0인 문자, '\0') 포함)인 C 언어 스타일의 문자열을 참조합니다.

연산자

항목 내용
operator =(const basic_string_view& other) (C++17~) other복사 대입합니다.
== (C++17~)
!= (~C++20)
두 문자열이 같은지, 다른지 검사합니다. 단순히 포인터 비교하는게 아니라 실제 문자들을 비교합니다.
<, <=, >, >= (~C++20)
<=> (C++20~)
두 문자열을 대소 비교합니다.
<<, >> (C++17~) 출력 스트림에 출력하거나, 입력 스트림에서 문자열을 추출합니다.

할당과 문자열 관리

항목 내용
size() (C++17~)
length() (C++17~)
문자 갯수를 리턴합니다.
empty() (C++17~) 문자열이 비었는지 확인합니다.
max_size() (C++17~) 저장할 수 있는 최대 문자 갯수를 리턴합니다.
swap() (C++17~) string_view의 내부 데이터를 바꿔치기 합니다.

# 문자 검색

항목 내용
[] (C++17~) 요소에 접근합니다.
at() (C++17~) position위치의 요소 참조자를 리턴합니다. position이 잘못된 위치이면 [] 과 달리 예외가 발생하며, 검사 코드가 추가되어 상대적으로 속도 부하가 있습니다.
begin(), end() (C++17~) 순방향 이터레이터를 리턴합니다.
rbegin(), rend() (C++17~) 역방향 이터레이터를 리턴합니다.
cbegin(), cend() (C++17~) 순방향 이터레이터를 리턴합니다. 이때 요소를 수정할 수 없습니다.
crbegin() crend() (C++17~) 역방향 이터레이터를 리턴합니다. 이때 요소를 수정할 수 없습니다.
data() (C++17~) 컨테이너가 관리하는 메모리 블록을 리턴합니다. 끝에 널문자(정수 0인 문자, '\0')가 없을 수도 있습니다.
front() (C++17~) 첫번째 요소의 참조자를 리턴합니다. 문자열이 비었다면 아무 생각없이 실행되어 오동작 합니다.
back() (C++17~) 마지막 요소의 참조자를 리턴합니다. 문자열이 비었다면 아무 생각없이 실행되어 오동작 합니다.
find() (C++17~)
rfind() (C++17~)
지정된 문자 시퀀스와 일치하는 첫번째 인덱스를 찾습니다.
find_first_of() (C++17~)
find_first_not_of() (C++17~)
지정된 문자들중 일치하는 문자가 있는 첫번째 인덱스를 찾습니다.
find_last_of() (C++17~)
find_last_not_of() (C++17~)
지정된 문자들중 일치하는 문자가 있는 마지막 인덱스를 찾습니다.

요소 삽입/삭제/비교/추출

항목 내용
compare() (C++17~) 문자열을 대소 비교합니다.
starts_with() (C++20~) 주어진 부분 문자열로 시작하는지 검사합니다.
ends_with() (C++20~) 주어진 부분 문자열로 끝나는지 검사합니다.
contains() (C++23~) (작성중)
substr() (C++17~) string에서 부분 문자열을 복사하여 리턴합니다.
copy() (C++17~) string에서 부분 문자열을 문자배열에 복사합니다.

태그:

카테고리:

업데이트:

댓글남기기