2 분 소요

Intro

코딩테스트 문제를 풀어보면 문자열을 잘 다뤄야하는 문제가 굉장히 많다.

이번 포스팅에서는 C++ 에서 문자열 사용을 유용하게 해주는 string 클래스에 대해서 정리한다.

String Class

  • C++ 에서는 문자열을 다루기 위해 string 클래스를 사용할 수 있다.
  • 간단하게 헤더를 추가하면 된다.
// string 헤더 추가
#include <string>

선언 및 초기화

  • C언어와 달리 마지막에 ‘\0’가 삽입되지 않아도 된다.
#include <string>

using namespace std;

int main()
{
    // 1. 선언과 동시에 초기화
    string s1 = "Hello";
    string s2("Hello");

    // 2. 변수를 통한 초기화
    string s3(s1);
}

string 클래스의 다양한 멤버 함수

  • 문자열을 다룰 때 자주 사용되는 함수들을 정리해봤다.
#include <string>

using namespace std;

int main()
{
    // 1. string의 특정 원소에 접근
    str.at(index);                  // index번째의 원소를 반환
    str[index];                     // index번째의 원소를 반환
    str.front();                    // str의 첫번재 원소를 반환
    str.back();                     // str의 마지막 원소를 반환

    /*
        str.at(index) 과 str[index] 의 차이점
        - str.at(index) 는 index가 유효한 범위인지 확인한다.  
    */
    // 2. string의 크기
    str.length();                   // str의 길이를 반환
    str.size();                     // str의 길이를 반환
    str.capacity();                 // str에 할당된 메모리 크기를 반환
    str.empty();                    // str이 빈 문자열인지 확인하고 T/F 반환

    
    // 3. string에 삽입, 추가, 삭제
    str.append(str1, n, m);         // str 뒤에 str1를 이어붙임
                                    // str1의 n번째부터 m번째까지를 붙임(n,m은 생략가능)

    str.insert(n, str1);            // str의 n번째 index 앞에 str1을 삽입

    str.replace(n, k, str1);        // str의 n번째 index부터 k개의 문자를 str1으로 대체

    str.erase(n, m);                // str의 n번째 index부터 m개의 문자를 지움

    str.push_back(char c);          // vector와 동일하게 str뒤에 '문자'를 붙여줌
    
    // 4. 기타 유용한 멤버 함수
    str.find(str1, n);              // str에 str1이 포함되어있는지 확인(있다면 첫번째 index 반환)
                                    // n번째 index부터 str1이 포함되어있는지 확인(n생략 가능)
    str.substr(n, k);               // str의 n번째부터 k개의 문자를 반환

    str.compare(str1);              // str과 str1을 비교
                                    // 같으면 0, str < str1 : 음수, str > str1 : 양수
    isdigit(c);                     // 문자 c가 숫자이면 true

    isalpha(c);                     // 문자 c가 영어이면 true

    toupper(c);                     // 문자 c를 대문자로 변환

    tolower(c);                     // 문자 c를 소문자로 변환
}

알아두면 좋은점

  1. string은 원하는곳에 문자열을 삽입하거나 삭제할 수 있지만 시간복잡도 O(N)이 소요된다.

  2. string 뒤에 문자열을 삽입할 때 ‘+’ 연산자를 사용하면 되는데, 이때 대입연산자를 사용하는것이 더 빠르다.

/*
    1번 방식의 시간복잡도는 O(N)
    2번 방식의 시간복잡도는 O(N^2)

    Why?
    1번 방식은 문자열 str의 마지막에 "A"가 추가되는 방식
    2번 방식은 매번 새로운 문자열을 만들어내는것

    - JAVA에서는 항상 "str += 'A'" 이라고 써도 "str = str + 'A'"로 변환된다고 한다.
*/

string str = "abc";

// 1번 방식
for(int i = 0;i < 1000000; i++)
{
    str += "A";
}
// 2번 방식
for(int i = 0;i < 1000000; i++)
{
    str = str + "A";
}

댓글남기기