본문 바로가기
Program Language/c++

C++ 기초(std::string_view 클래스)

by 토담이아빠 2023. 3. 3.

std::string_view 클래스

 

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 클래스의 멤버 함수를 적절히 활용하면 문자열 처리를 보다 편리하고 빠르게 수행할 수 있습니다.


 

댓글