본문으로 바로가기

C++17) std::string_view

category C++/Modern 2019. 2. 26. 01:58

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4562.html#string.view


템플릿 클래스인 basic_string_view 는 const char* 같은 상수 연속 시퀀스를 참조 할 수 있는 객체입니다.


원래의 std::basic_string은 const char* 의 암시적 변환을 지원했기 때문에, const string& 형을 인자로 받는 곳에서 const char* 타입을 사용할 시

const char* -> std::basic_string으로 암시적으로 변환되어 오버헤드를 발생했습니다.


사용자는 std::basic_string_view 를 사용하여 함수와 상호운용 해야합니다.


std::basic_string_view는 따로 지정되지 않는 이상 복잡도는 O(1) 입니다.


1
2
3
4
5
6
7
void func1(const std::string& rhs) {
    // 무언가 작업을 할겁니다.
}
 
int main() {
    func1("abcdefg");    //abcdefg는 const char* 형입니다.
}
cs

std::basic_string 에는 const char* 형의 암시적 변환을 지원하는 생성자가 있기 때문에, abcdefg 는 func1에 들어가면서 
std::basic_string으로 변환됩니다.

std::basic_string_view 는 대부분 읽기만을 필요한 함수에 사용되기 때문에 문자의 첫내용과, 문자열의 길이만 멤버변수로 가지고 있습니다.

std::basic_string_view가 std::basic_string으로 초기화 될때, 복잡도는 O(1) 입니다, ( std::basic_string에서 size와 data만 가져오기 때문입니다 )
std::basic_string_view가 const char* 로 초기화 될때, 복잡도는 const char*의 길이만큼 입니다.

std::basic_string_view는 일반 std::basic_string 과는 다릅니다. 읽기 전용으로 만들어졌기 때문에 std::basic_string 의 멤버 함수는 포함이 되지 않는다고 생각하시면 됩니다.

대신 std::basic_string_view 만의 멤버함수가 생겨났습니다.

1
2
constexpr void remove_prefix(size_type n);
constexpr void remove_suffix(size_type n);
cs

remove_prefix는 앞 부분부터 size 만큼 글자를 줄입니다. 

remove_suffix 는 뒷 부분부터 size 만큼 글자를 줄입니다.


C++ 에선 std::string_view를 위한 문자열 리터럴이 추가되었습니다.

"abcdefg"sv 입니다. ( 이 리터럴을 사용하려면 using namespace std::literals 가 필요합니다. )