C++ 17에 std::string_view가 추가되었다.
기존에 std::string이 있는데 std::string_view가 따로 추가된 이유는 무엇일까?
문자열을 다루는 함수를 만든다고 해보면 매개변수를
const char* 혹은 const std::string& 으로 만드는 것이 보통이다.
이 두가지 선택은 각각 장단점을 가지게 된다.
const char*를 선택했다면 문자열 리터럴을 포함한 문자열 포인터를 받는데 용이하다.
대신 std::string에서 제공해주는 많은 기능을 사용할 수 없다.
const std::string&을 선택했다면 std::string의 기능을 사용할 수 있지만
문자열 리터럴을 받는다면 std::string 객체가 생성된다.
함수를 오버로딩해서 const char*, const std::string& 함수를 모두 만들면 해결은 되지만
뭔가 좋아보이지는 않는다.
두가지 장점을 모두 가져가기 위해 추가된 것이 std::string_view이다.
std::string_view는 내부에 포인터와 길이정보를 가진다.
그래서 문자열 포인터를 바로 받을 수 있으면서 std::string의 기능을 제공해준다.
포인터와 길이 정보만 가지고 있기 때문에 보통 레퍼런스가 아닌 값을 전달하는 방식으로 구현한다.
using namespace std::string_view_literals;
void StringViewTest(std::string_view strv)
{
std::cout << "str : " << strv.data() << " length : " << strv.length() << std::endl;
}
StringViewTest("abcdefg");
std::string TestString("Test");
StringViewTest(TestString);
auto sv = "My Test String View"sv;
StringViewTest(sv);
간단한 예제는 위와 같다.
std::string_view를 매개변수로 받는 함수로 문자열 리터럴, std::string, std::string_view를 처리할 수 있다.
참고로 using namespace std::string_view_literals;를 추가하면
문자열 뒤에 sv를 붙여줌으로써 string_view 리터럴을 사용할 수 있다.
'프로그래밍 > C, C++' 카테고리의 다른 글
[C++] 스마트 포인터 unique_ptr 간단 정리 (0) | 2021.08.05 |
---|---|
[C++11/C++17] 유니폼 초기화 (Uniform Initialization) (0) | 2021.07.30 |
More Effective C++ - 항목5 ~ 항목8 (0) | 2018.04.01 |
More Effective C++ - 항목1 ~ 항목4 (0) | 2017.12.02 |
warning MSB8004: Output Directory does not end with a trailing slash. (1) | 2011.08.21 |