C++17이전에는 읽기 전용 스트링을 받는 함수의 매개변수 타입을 쉽게 결정할 수 없었다. const char*로 지정하면 std::string을 사용하는 클라이언트에서 c_str( )나 data( )를 이용하여 string을 const char*로 변환해서 호출해야 한다. 이렇게 하면 std::string의 객체지향 속성과 여기서 제공하는 헬퍼 메서드를 제대로 활용할 수 없다.
이러한 문제를 해결하기 위해서는 C++17부터 추가된 std::string_view를 사용하면 된다.
std::string_view
- 헤더: <sring_view>
- 클래스 템플릿: std::base_string_view
- 추가 메서드: remove_prefix(size_t), remove_suffix(size_t)
→ 지정한 오프셋만큼 스트링의 시작 포인터를 앞으로 당기거나 끝 포인터를 뒤로 미뤄서 스트링을 축소하는 기능
- 유의사항: string과 string_view를 서로 연결/결합할 수 없다.
- 리터널: 표준 사용자 정의 리터널인 'sv'를 사용하면 스트링 리터널을 std::string_view로 만들 수있다.
ex) auto string1 = "Love my blog a lot"sv ; // auto type: string_view
ex) auto string2 = "Love my blog a lot"s ; // auto type: string
ex) auto string3 = "Love my blog a lot" ; // auto type: const char*
- 특징: 대부분 값으로 전달(Pass-By-Value)한다.
→ 스트링에 대한 포인터와 길이만 갖고 있어서 복사하는데 오버헤드가 적기 때문이다.
string_view는 실제로 const string& 대신 사용할 수 있으며 오버헤드도 없다. 다시 말해 스트링을 복사하지 않는다. string_view의 인터페이스는 c_str( )이 없고 data( )는 똑같이 제공한다.
출처: 전문가를 위한 C++
'👨🏻💻 programming > ◽ c, c++' 카테고리의 다른 글
[c++]'전문가를 위한 C++17'을 공부하며 정리(ing...) (0) | 2022.05.16 |
---|---|
[C++] 제네릭 알고리즘 모음 (0) | 2022.05.16 |
[C++] 연산자 오버로딩 프로토타입 & 한계 (0) | 2022.02.08 |
(전문가를 위한 C++/ 개정 4판) - I/O 입출력 완전 분석 (0) | 2022.01.31 |
[C++] 비동기 프로그래밍 (0) | 2021.03.14 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!