C++ string 클래스

flowjiyun·2022년 6월 22일

CPP

목록 보기
4/4
post-thumbnail

해당 내용은 Pope 님의 C++ 언메니지드 프로그래밍 강좌를 공부하면서 정리하였습니다.

std::string 클래스

  • 헤더 :
  • 기존 입력방법 cin의 문제점
char line[256];
cin.getline(line, 256);

// 위의 코드가 작동하지 않는 경우
// 1. 아무것도 읽지 못했을 때
// 2. 한 줄에 문자가 256자 이상일 때(즉, 버퍼가 충분히 크지 않을 때)

string 클래스 특징 및 기능

  • 기존 char 배열 (문자열)의 한계점을 해결
//std::string클래스를 이용한 문자열은 길이가 증가할 수 있음

#include <string>
std::string firstname;
std::cin >> firstname;

//assignment && append

string firstname = "park";
string fullname = "jiyun";

fullname = firstname;
fullname += " jiyun";

//compare
if (firstname == fullname)
{
}
// 사전상의 순서를 비교 (아스키코드 기준)
if (firstname > fullname)
{
{

//size(), length()

cout << firstname.size() << endl; // 문자열의 길이를 반환
cout << firstname.length() << endl;

//c_str()
// 해당 string이 가지고 있는 문자 배열의 시작 주소를 가리키는 포인터를 반환
string line;
cin >> line;
const char* cline = line.c_str();

// string 속의 한 문자에 접근
//[] 자체가 연산자임
string firstname = "park";
char letter = firstname[1];
firstname[2] = 'p'; // 연산후 참조형을 반환함을 알 수 있음(특정 값을 대입할 수 있기 때문)

// at()
// 해당 문자열에서 주어진 위치의 문자를 참조로 반환
char letter = firstname.at(1);
firstname.at(2) = 'p';

string 클래스는 어떻게 구현되어 있을까?

1. 초기화

#include <string>
string line;
  • 멤버 변수
    • 용량 : 15
    • 길이(size) : 0
    • 포인터(문자열 첫번째 주소)
      • 초기에 16바이트 동적할당함

2. 값 할당 시

line = "park";
line += "hello? is size enough?"
  • 값을 동적할당된 문자열에 memcopy
  • 초기 동적할당된 문자열의 크기보다 들어오는 값이 클 경우
    1. 크기를 늘려 새로운 문자열 크기만큼 동적할당
    2. 새로운 heap 메모리 위치에 기존 문자열에 저장되어 있던 값 복사
    3. 기존 문자열 free (메모리 누수 방지)
    4. 새로 들어올 값 복사
  • 단점
    • 힙메모리 할당 / 해제는 느림
    • 메모리 단편화 문제 생김(연속된 메모리를 찾을 수 없을때 빈공간 생길 수도)
    • 여전히 c 스타일 문자열 쓰는 경우도 있음
profile
FLOW & VECTOR

0개의 댓글