std::string_view 클래스는 C++17부터 도입된 새로운 문자열 타입으로, 문자열 데이터의 읽기 전용 뷰를 제공합니다. 이 클래스는 문자열 데이터를 복사하지 않고, 내부적으로 포인터와 길이 정보만을 저장하여 문자열 데이터를 읽을 수 있는 뷰를 제공합니다.
주요 특징
std::string_view 클래스의 주요 특징은 다음과 같습니다.
- 읽기 전용 뷰 : 원본 문자열 데이터를 수정할 수 없으며, 읽기 전용 뷰만을 제공합니다.
- 복사 없음 : 문자열 데이터를 복사하지 않으므로, 문자열 처리 성능을 향상시킵니다.
- 메모리 안전성 : 문자열 데이터를 복사하지 않으므로, 메모리 안전성을 보장합니다.
- 호환성 : 다른 문자열 타입과 호환되는 타입으로 변환하여 사용할 수 있습니다.
사용 방법
std::string_view 클래스는 다양한 상황에서 사용될 수 있습니다. 예를 들어, 문자열 검색, 분석, 비교 등의 작업에서 유용하게 사용될 수 있습니다.
1. 문자열 검색
#include <iostream>
#include <string_view>
int main() {
std::string_view view("Hello, world!");
std::size_t index = view.find("world");
if (index != std::string_view::npos) {
std::cout << "Found 'world' at index " << index << std::endl;
}
else {
std::cout << "Not found" << std::endl;
}
return 0;
}
[결과]
Found 'world' at index 7
위 예제에서는 std::string_view 객체를 생성하고, find 함수를 사용하여 문자열 world를 검색합니다. 검색 결과가 std::string_view::npos와 같지 않으면 문자열을 찾은 것이고, 같으면 찾지 못한 것입니다.
2. 문자열 분석
#include <iostream>
#include <string_view>
#include <cstring>
int main() {
std::string_view view("Hello, world!");
const char* prefix = "Hello";
const char* suffix = "!";
bool has_prefix = std::strncmp(view.data(), prefix, std::strlen(prefix)) == 0;
bool has_suffix = std::strncmp(view.data() + view.size() - std::strlen(suffix), suffix, std::strlen(suffix)) == 0;
if (has_prefix && has_suffix) {
std::cout << "Found prefix and suffix" << std::endl;
}
else {
std::cout << "Not found" << std::endl;
}
return 0;
}
[결과]
Found prefix and suffix
위 예제에서는 std::string_view 객체를 생성하고, strncmp 함수를 사용하여 문자열의 접두사와 접미사를 검사합니다. 검색 결과가 true이면 문자열에 접두사와 접미사가 포함된 것이고, false 이면 포함되지 않은 것입니다.
3. 문자열 비교
#include <iostream>
#include <string_view>
int main() {
std::string_view view1("Hello, world!");
std::string_view view2("Hello");
int result = view1.compare(view2);
if (result == 0) {
std::cout << "Strings are equal" << std::endl;
}
else if (result < 0) {
std::cout << "First string is less than second string" << std::endl;
}
else {
std::cout << "First string is greater than second string" << std::endl;
}
return 0;
}
[결과]
First string is greater than second string
위 예제에서는 std::string_view 객체를 생성하고, compare 함수를 사용하여 두 문자열을 비교합니다. 결과가 0이면 두 문자열이 같은 것이고, 결과가 0보다 작으면 첫 번째 문자열이 두 번째 문자열보다 작은 것입니다. 또한 결과가 0보다 크면 첫 번째 문자열이 두 번째 문자열보다 큰 것입니다.
멤버 함수
std::string_view 클래스의 멤버 함수들은 다음과 같습니다.
- at: 인덱스 위치에 있는 문자를 반환합니다. 인덱스 위치가 문자열 범위를 벗어나면 예외를 발생시킵니다.
- operator[]: 인덱스 위치에 있는 문자를 반환합니다. 인덱스 위치가 문자열 범위를 벗어나면 예외를 발생시키지 않습니다.
- front: 문자열의 첫 번째 문자를 반환합니다.
- back: 문자열의 마지막 문자를 반환합니다.
- data: 문자열 데이터를 가리키는 포인터를 반환합니다.
- size: 문자열의 길이를 반환합니다.
- length: 문자열의 길이를 반환합니다.
- empty: 문자열이 비어 있는지 여부를 반환합니다.
- remove_prefix: 문자열의 접두사를 제거합니다.
- remove_suffix: 문자열의 접미사를 제거합니다.
- substr: 문자열의 일부를 추출합니다.
- copy: 문자열의 일부를 복사합니다.
- swap: 두 개의 std::string_view 객체를 교환합니다.
- find: 문자열을 검색합니다.
- rfind: 문자열을 역순으로 검색합니다.
- find_first_of: 문자열 중 하나를 검색합니다.
- find_last_of: 문자열 중 하나를 역순으로 검색합니다.
- find_first_not_of: 문자열 중 하나를 제외한 문자열을 검색합니다.
- find_last_not_of: 문자열 중 하나를 제외한 문자열을 역순으로 검색합니다.
- compare: 문자열을 비교합니다.
다음은 std::string_view 클래스의 일부 멤버함수와 그 사용예제입니다.
1. size() : 문자열의 길이를 반환합니다.
#include <iostream>
#include <string_view>
int main()
{
std::string_view view("Hello, world!");
std::cout << "Length: " << view.size() << std::endl;
return 0;
}
[결과]
Length: 13
2. empty() : 문자열이 비어있는지 여부를 반환한다.
#include <iostream>
#include <string_view>
int main()
{
std::string_view view("");
std::cout << "Is empty: " << view.empty() << std::endl;
return 0;
}
[결과]
Is empty: 1
3. substr(size_t offset, size_t count) : 문자열의 일부(offset 위치에서 count 만큼)를 추출하여 새로운 std::string_view 객체를 반환한다.
#include <iostream>
#include <string_view>
int main()
{
std::string_view view("Hello, world!");
std::string_view subview = view.substr(0, 5);
std::cout << "Substring: " << subview << std::endl;
return 0;
}
[결과]
Substring: Hello
4. data() : 문자열 데이터의 포인터를 반환합니다.
#include <iostream>
#include <string_view>
int main()
{
std::string_view view("Hello, world!");
const char* ptr = view.data();
std::cout << "String data: " << ptr << std::endl;
return 0;
}
[결과]
String data: Hello, world!
이 처럼 std::string_view 클래스의 멤버 함수를 적절히 활용하면 문자열 처리를 보다 편리하고 빠르게 수행할 수 있습니다.
'Program Language > c++' 카테고리의 다른 글
C++ 중급(동적 메모리 사용하기) (20) | 2023.03.08 |
---|---|
C++ 기초(코딩 스타일) (14) | 2023.03.06 |
C++ 기초(std::string 클래스) (7) | 2023.03.02 |
C++ 기초(Raw String Literal) (13) | 2023.02.20 |
C++ 기초(직원 관리 시스템 - 사용자 인터페이스) (10) | 2023.02.13 |
댓글