C++의 문자열 보기

C Ui Munjayeol Bogi



C++ 프로그래밍 영역에서는 효율성과 성능의 우선순위를 결정하는 것이 중요합니다. C++17에 도입된 'std::string_view' 클래스는 기존 문자열 조작에 대한 다재다능하고 메모리 효율적인 대안을 제시합니다. 기본적으로 'std::string_view'는 문자 시퀀스에 대한 비소유 참조이며 일반적으로 더 큰 문자열의 하위 문자열을 나타냅니다. 내부적으로 데이터를 소유하고 메모리를 관리하는 'std::string'과 달리 'std::string_view'는 기본 데이터를 소유하지 않고 작동합니다. 이러한 특성은 메모리 복사 또는 관리에 따른 오버헤드가 바람직하지 않은 시나리오에 특히 유용합니다. 이 기사에서는 C++에서 'std::string_view'의 활용을 이해하기 위해 다양한 예를 살펴보겠습니다.

예제 1: 효율적인 문자열 처리

최신 C++ 개발에서는 성능과 리소스 활용도를 최적화하기 위해 효율적인 문자열 처리가 중요합니다. 메모리 재할당이나 복제 없이 문자열에 효율적으로 액세스하고 조작할 수 있습니다. 이 개념을 설명하기 위해 실제 사례를 살펴보겠습니다.







다음 코드 조각을 고려해보세요.



#include
#include

무효 프로세스StringView ( std::string_view strView ) {

표준::cout << '길이: ' << strView.length ( ) << 표준::endl;
표준::cout << '콘텐츠: ' << strView << 표준::endl;
}

정수 메인 ( ) {

std::string 원본문자열 = '효율적인 문자열 처리' ;

std::string_view viewOfString ( 원본문자열 ) ;

processStringView ( viewOfString ) ;

반품 0 ;
}


이 예에는 'std::string_view'를 매개변수로 사용하는 'processStringView' 함수가 있습니다. 그런 다음 함수는 표준 출력을 사용하여 문자열 보기의 길이와 내용을 인쇄합니다. 기본 함수는 '효율적인 문자열 처리' 값을 사용하여 'originalString'이라는 'std::string'을 초기화합니다. 이어서, 'originalString'의 내용을 참조하여 'viewOfString'이라는 이름의 'std::string_view'가 생성됩니다.



'viewOfString'을 'processStringView' 함수에 전달하면 문자열에 대한 작업을 효율적으로 수행할 수 있으므로 추가 메모리 할당이 필요하지 않습니다. 'std::string_view'는 데이터를 복사하지 않고 'originalString'의 기본 문자 시퀀스에 대한 간단한 참조입니다.





생성된 출력은 다음과 같습니다.



예 2: 레거시 코드와의 상호 운용성

C++ 개발 영역에서는 새로운 코드베이스와 기존 코드베이스의 원활한 통합이 중요한 문제인 경우가 많습니다. 'std::string_view'를 사용하면 개발자는 'const char' 포인터를 반환하는 레거시 함수와 쉽게 상호 작용할 수 있습니다.

상호 운용성을 위한 'std::string_view'의 실제 사용을 보여주는 다음 예를 고려하십시오. 여기에는 'const char' 포인터를 반환하는 'legacyFunction()'이라는 레거시 함수가 있습니다.

#include
#include

const 문자 * 레거시함수 ( ) {
반품 '레거시 문자열' ;
}

정수 메인 ( ) {

std::string_view 레거시StrView ( 레거시함수 ( ) ) ;

표준::cout << '레거시 문자열 보기: ' << 레거시StrView << 표준::endl;

반품 0 ;
}


먼저 'Legacy String'이라는 레이블이 붙은 문자열을 나타내는 'const char' 포인터를 반환하는 'legacyFunction()'이라는 레거시 함수를 정의합니다. 이 레거시 데이터를 최신 C++ 프로그램에 원활하게 통합하기 위해 'std::string_view'를 사용합니다. 특히 main() 함수에서는 'legacyStrView'라는 이름의 'std::string_view' 인스턴스를 생성하고 이를 레거시 함수의 결과로 초기화합니다. 이 인스턴스화를 통해 레거시 'const char' 포인터를 효율적으로 캡슐화하고 작업할 수 있습니다.

결과적으로 불필요한 데이터 복사에 의존하지 않고도 레거시 문자열에 액세스하고 조작할 수 있어 효율성과 호환성이 모두 유지됩니다. 코드의 마지막 단계에는 'std::cout'을 활용하여 레거시 문자열 보기의 내용을 인쇄하는 작업이 포함됩니다.

실행된 출력은 다음과 같습니다.

예제 3: 향상된 문자열 리터럴 처리

C++의 문자열 리터럴은 전통적으로 문자 배열로 표현됩니다. 'std::string_view'는 편리한 인터페이스를 제공하여 문자열 리터럴 작업을 단순화합니다. 명시적인 변환 없이 기본 문자 배열에 대한 직접 액세스를 허용함으로써 'std::string_view'는 문자열 리터럴에 대한 작업을 간소화합니다.

#include
#include

정수 메인 ( ) {
const 문자 * myLiteral = '안녕하세요, 스트링뷰입니다!' ;
std::string_view 리터럴뷰 ( myLiteral ) ;

표준::cout << '첫 번째 문자: ' << 리터럴뷰 [ 0 ] << 표준::endl;

size_t 위치 = literalView.find ( '끈' ) ;
표준::cout << '하위 문자열 위치: ' << 위치 << 표준::endl;

반품 0 ;
}


이 예에서는 'Hello, String View!' 문자열 리터럴은 'myLiteral' 포인터에 할당됩니다. 'std::string_view'를 도입하면 해당 내용을 복사할 필요 없이 이 문자열을 보다 효율적으로 표현할 수 있습니다. 'literalView' 객체는 기본 문자 시퀀스를 보고 조작할 수 있는 'myLiteral' 포인터를 사용하여 생성됩니다.

'std::string_view'를 사용하면 문자열 내의 개별 문자에 쉽게 액세스할 수 있습니다. 코드 조각에서 'literalView[0]'은 문자열의 첫 번째 문자를 검색하고 인쇄하여 요소에 액세스하는 단순성과 직접성을 보여줍니다. 'std::string_view'의 'find' 메소드는 원래 문자열 내에서 'String' 하위 문자열의 위치를 ​​결정하는 데 사용됩니다.

예제 4: 하위 문자열 추출

하위 문자열 추출 작업에는 구분 기호 위치와 같은 지정된 기준을 기반으로 주어진 문자열의 일부를 검색하는 작업이 포함됩니다. 하위 문자열을 손쉽게 추출하는 기능은 'std::string_view'의 강력한 기능입니다. 구분 기호를 기반으로 문자열의 일부를 추출해야 하는 시나리오를 생각해 보세요.

#include
#include

정수 메인 ( ) {
std::string fullString = '사과-오렌지-바나나' ;
size_t delimiterPos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , 구분자 위치 ) ;

표준::cout << '추출된 하위 문자열: ' << 하위 문자열 << 표준::endl;

반품 0 ;
}


이 코드 조각에서는 'apple-orange-banana' 값으로 초기화되는 원래 문자열 'fullString'의 선언으로 시작합니다. 우리의 목표는 부분 문자열 추출을 수행하는 것입니다. 이를 달성하기 위해 C++ 표준 라이브러리에서 제공하는 '찾기' 기능을 사용합니다.

'delimiterPos' 변수에 저장된 'fullString' 내의 구분 기호 위치를 식별하면 원하는 하위 문자열을 추출합니다. 'substr' 함수는 원래 문자열에서 호출되어 시작 위치(0)와 정확히 구분 기호 위치인 하위 문자열의 길이를 지정합니다. 이 작업을 수행하면 처음부터 구분 기호까지 원래 문자열의 일부를 나타내는 'subString'이라는 'std::string_view'가 생성됩니다.

예제 5: 메모리 효율적인 데이터 구조

'std::string_view'는 메모리 효율적인 데이터 구조를 설계하는 데 중요한 역할을 합니다. 문자열의 여러 복사본을 저장하는 대신 데이터 구조는 'std::string_view' 인스턴스를 저장할 수 있으므로 메모리 오버헤드가 줄어듭니다.

#include
#include

구조체 레코드 {
std::string_view 이름;
나이;
} ;

정수 메인 ( ) {

기록하는 사람 = { '존 도우' , 30 } ;

표준::cout << '이름: ' << 사람.이름 << ', 나이: ' << 인물 << 표준::endl;

반품 0 ;
}


이 코드 조각에서는 메모리 효율적인 데이터 구조 내에서 'std::string_view'를 활용하는 방법을 보여줍니다. 'name'이라는 'std::string_view' 멤버와 'age'라는 정수 멤버로 구성된 'Record' 구조를 정의합니다. 이 컨텍스트에서 'std::string_view'를 사용하면 추가 메모리 할당 없이 문자열의 가벼운 표현을 만들 수 있습니다.

'main' 함수에서 이름이 'John Doe'이고 나이가 30세인 'person'이라는 'Record' 개체를 인스턴스화합니다. 'std::string_view' 멤버 'name'은 비소유 뷰 역할을 합니다. 이름에 해당하는 문자 데이터를 사용하므로 문자열 내용을 복제할 필요가 없습니다. “std::cout << “이름: ” << person.name << “, Age: ” << person.age << std::endl;” 명령문은 “Record” 객체에 저장된 사람의 이름과 나이를 출력합니다.

결론

끊임없이 진화하는 C++ 개발 환경에서 'std::string_view'는 프로그래머 툴킷에 추가된 귀중한 기능입니다. 이 기사에 설명된 사례는 C++ 프로그래밍 영역 내에서 'std::string_view'의 적응성과 유용성을 강조합니다. 효율적인 문자열 조작 및 레거시 코드와의 원활한 상호 운용성부터 메모리 효율적인 데이터 구조에 이르기까지 'std::string_view'는 다양한 시나리오에서 향상된 성능과 최적화된 코드를 원하는 개발자에게 유용합니다. 이러한 실제 시나리오는 'std::string_view'가 어떻게 코드를 최적화하고 불필요한 메모리 오버헤드를 줄이며 C++ 애플리케이션의 전반적인 효율성에 기여할 수 있는지 보여줍니다.