Data Structure/C++ STL

[C++ STL] std::string

lumana 2024. 6. 30. 18:55

std::string이란?

  • STL에서 제공하는 문자열 처리 클래스
  • 동적 길이 문자열을 다루기 쉽게 만들어준다.
  • <string>에 정의되어 있다.

 

내부 구현?

  • 문자열의 크기에 따라 동적으로 할당하여 문자열 데이터를 저장한다
  • 짧은 문자열은 내부 버퍼에 따로 저장하여 동적 할당을 하지 않는다
  • 복사 및 연산 과정에서 기본적으로 깊은 복사를 사용한다. 포인터나 참조가 기반으로 관리되지 않는다

초기화

기본 생성자 : 빈 문자열 생성

std::string s;

 

C-스타일 문자열로부터 생성

std::string s1("Hello");
std::string s2 = "Hello";
std::string s3 = "";

 

반복자로부터 생성

std::string s(iter1, iter2);

 

특정 문자 n개로 초기화

std::string s(5, 's');// "sssss"

 

부분 문자열

std::string s1 = "abc";

std::string s2(s1, 1, 2); // s1[1]부터 2개 문자를 복사하여 생성합니다.
EXPECT_TRUE(s2 == "bc");

// std::string s3(s1, 100, 2); // (X) 예외 발생. s1[100]부터 2개 복사. out_of_range

std::string s4(s1, 0, std::string::npos); // s1[0] 부터 끝까지 복사하여 생성합니다.
EXPECT_TRUE(s4 == s1);

std::string s5(s1.begin(), s1.end()); // s1.begin()부터 s1.end() 직전 까지 복사하여 생성합니다. 즉, s1[0]부터 끝까지 복사하여 생성합니다.
EXPECT_TRUE(s5 == s1);

const char* ptr = "abc";
std::string s6("abc", 2); // ptr에서 2개 복사하여 생성합니다.
EXPECT_TRUE(s6 == "ab");

 

참조) https://tango1202.github.io/legacy-cpp-stl/legacy-cpp-stl-string/

 

#17. [레거시 C++ STL] 문자열

string과 wstring은 public Non-Virtual 소멸자이므로 상속하여 재구현 하지 마라. 수정될 필요가 없는 문자열 데이터는 const char* 나 const wchar_t*로 관리하라.(배열이나 string, wstring을 쓰면 복제된다.) string

tango1202.github.io

 

문자열 수정

append: 문자열을 끝에 추가

 
s.append(" World");

 

insert : 문자열을 지정된 위치에 삽입

s.insert(5, " C++");

 

erase : 지정된 위치의 문자열 제거

s.erase(5, 3);  // 5번 인덱스부터 3글자 제거

 

replace : 지정된 범위의 문자들을 다른 문자열로 대체

s.replace(0, 5, "Hi");  // 처음 5글자를 "Hi"로 대체

 

문자열 연산자

  • "="를 이용하여 문자열 할당
  • "+", "+="를 이용하여 문자열 합성
  • "=", "!=", "<", ">", "<=", ">="를 이용하여 대소 비교
std::string s = "abc";

EXPECT_TRUE(s == "abc");
EXPECT_TRUE(s != "def");
EXPECT_TRUE(s < "ccc");
EXPECT_TRUE(s.compare("ccc") < 0); // s < "ccc"
EXPECT_TRUE(s.compare("abc") == 0); // s == "abc"
EXPECT_TRUE(s.compare("aaa") > 0); // s > "aaa"

 

문자열 검색

find : 부분 문자열 검색. 주어진 부분 문자열의 위치를 리턴한다. 리턴받은 인덱스 이후부터 찾을 수 있다.

std::size_t pos = s.find("Hello");
if (pos != std::string::npos) { /* ... */ }

 

find_first_of(), find_last_of() : 전달한 문자들 중 일치하는 문자가 있는 첫 번째/마지막 위치를 리턴한다

std::size_t pos = s.find_first_of("aeiou");
std::size_t pos = s.find_last_of("aeiou");

 

rfind : 문자열을 역방향으로 검색

std::size_t pos = s.rfind("Hello");

 

부분 문자열 처리

substr : 부분 문자열을 복사하여 반환

replace : 부분 문자열로 대체

copy : 부분 문자열을 문자 배열에 복사

std::string s = "Hello. My name is Tango.";

std::string::size_type pos = s.find("Tango");
std::string::size_type count = std::string("Tango").size();

s.replace(pos, count, "Sam"); // Tango를 Sam으로 바꿉니다.
EXPECT_TRUE(s == "Hello. My name is Sam."); 

EXPECT_TRUE(s.substr(pos, 3) == "Sam"); // 부분 문자열을 복사하여 리턴합니다.

char arr[3]; // 문자 배열
s.copy(arr, 3, pos); // 크기가 3인 arr 배열에 pos 위치에서부터 배열 크기만큼 부분 문자열을 복사 합니다.
EXPECT_TRUE(arr[0] == 'S' && arr[1] == 'a' && arr[2] == 'm');

 

Program Example

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";
    
    // 문자열 길이
    std::cout << "Length: " << str.size() << std::endl;
    
    // 부분 문자열
    std::string sub = str.substr(7, 5);  // "World"
    std::cout << "Substring: " << sub << std::endl;
    
    // 문자열 검색
    std::size_t pos = str.find("World");
    if (pos != std::string::npos) {
        std::cout << "'World' found at position: " << pos << std::endl;
    }
    
    // 문자열 대체
    str.replace(7, 5, "C++");
    std::cout << "Replaced: " << str << std::endl;
    
    // 문자열 연결
    std::string str2 = " How are you?";
    str += str2;
    std::cout << "Concatenated: " << str << std::endl;
    
    return 0;
}

 

'Data Structure > C++ STL' 카테고리의 다른 글

[C++ STL] std::tuple  (0) 2024.06.30
[C++ STL] std::pair  (0) 2024.06.30
[C++ STL] 3.4 C++ 해시 테이블  (0) 2024.06.23
[C++ STL] 2.6 그래프(graph)  (0) 2024.06.21
[C++ STL] 2.5 힙(Heap)  (0) 2024.06.21