[C++][문자열] string 선언/연산/멤버 함수/응용 정리

김윤진·2024년 1월 25일
1

코딩테스트

목록 보기
1/2
post-thumbnail

string 클래스

  • C++ STL에서 제공하는 string을 다루는 클래스이다.
  • char*, char[]과 다르게 문자열의 끝에 ‘\0’이 들어가지 않고, 문자열의 길이를 동적으로 변경 가능하다.
  • #include <string> header를 추가해서 사용한다.

string 선언

  1. 빈 문자열 s 생성
    string s;

  2. “abc”로 선언된 s 생성
    string s = “abc”; string s; s = “abc”; string s(”abc”);

  3. “abc”로 s 동적할당
    string *s = new string(”abc”);

  4. 문자열 s를 copy한 t 생성
    string t(s);


string 연산

  • 문자열 비교 (>, <) : 두 문자열의 사전 순서를 비교 (return 1/0)
  • 문자열 동일 여부(==) : 문자열의 동일 여부 확인 (return 1/0)
  • 문자열 연결(+) : 두 문자열을 이어주는 역할
    • (참고) push_back은 문자 하나를 string의 가장 뒤에 추가함
#include <iostream>
#include <string>

using namespace std;

int main() {
	string a = "a";
	string b = "b";
	
	cout << (a < b); // output:1 - 괄호 주의
	cout << (a == b); // output:0 - 괄호 주의

	string c = a + b;
	cout << c; // output:"ab"

	c.push_back('c');
	cout << c; // output:"abc"
}

s.compare(t) 문자열 s와 문자열 t가 같은지 비교해서
s == t : 0 반환 / s > t : 양수 반환 / s < t : 음수 반환

swap(s, t) 문자열 s, t의 reference를 교환해서 swap


string의 멤버 함수

string의 특정 원소 접근

s.at(index)index 위치의 문자 반환 / 유효한 범위인지 체크 O
s[index]index 위치의 문자 반환 / 유효한 범위인지 체크 X / at보다 접근이 빠름
s.front()문자열의 가장 앞 문자 반환
s.back()문자열의 가장 뒤 문자 반환
s.begin()문자열의 첫번째 요소를 가리키는 iteratorO(1)
s.end()문자열의 마지막 요소 다음을 가리키는 iteratorO(1)

string의 크기

  • C의 문자열은 뒤에 ‘\0’이 붙어서 size == length + 1
  • C++의 문자열은 size, length의 반환 값이 같음
s.length()문자열 길이 반환 - 문자를 셈, 문자열의 길이에 비례해 시간 소요O(N)
s.size()문자열 길이 반환 - 컨테이너 자체에 크기 정보 저장, 크기 직접 반환O(1)
s.capacity()문자열이 사용 중인 메모리 크기 반환
s.empty()s가 빈 문자열인지 확인 (return 1/0)
s.resize(n)문자열을 n의 크기로 만듦
- 기존 문자열의 길이 < n : 남은 공간을 빈 공간으로 채움
- 기존 문자열의 길이 > n : n보다 큰 부분을 삭제
s.resize(n, ‘a’)n이 문자열의 길이보다 클 때 ‘a’로 빈 공간을 채움

string에 삽입 / 추가 / 삭제

s.append(t)문자열 s 뒤에 문자열 t를 이어 붙임 (s += t와 동일)
s.append(t, 1, 3)문자열 s 뒤에 <문자열 t[1]부터 3개의 문자>를 이어 붙임
s.append(n, ‘a’)문자열 s 뒤에 n개의 ‘a’를 이어 붙임
s.insert(n, t)문자열 s의 s[n] 앞에 문자열 t를 삽입함O(N)
s.replace(n. k, t)문자열 s의 s[n]부터 k개의 문자를 t로 대체함
s.clear()문자열 s를 모두 지움
s.erase(n, m)문자열 s의 n번째 문자부터 m개의 문자를 지움O(N)
s.erase(it1, it2)문자열 s의 it1부터 it2까지 지움O(N)
s.erase()s.clear()와 동일
s.push_back(’c’)문자열 s의 맨 뒤에 문자 c를 붙임O(1)
s.pop_back()문자열 s의 맨 뒤에 문자 하나를 제거O(1)
s.assign(t)s = t 정의와 동일

string에서 부분 문자열 찾기

s.find(”abcd”)“abcd”가 문자열 s에 포함되는지 확인하고, 있으면 해당 부분의 첫번째 index 반환O(N)
s.find(”abcd”, n)n번째 index부터 “abcd”를 찾고, 있으면 해당 부분의 첫번째 index 반환O(N)
s.substr()문자열 s 전체를 반환O(N)
s.substr(n)문자열 s의 n번째 index부터 끝까지의 문자를 부분 문자열로 반환O(N)
s.substr(n, k)문자열 s의 n번째 index부터 k개의 문자를 부분 문자열로 반환O(N)
isdigit(s[0])s[0] 문자가 숫자이면 true, 아니면 false 반환
isalpha(s[0])s[0] 문자가 영어이면 true, 아니면 false 반환

string을 숫자 int로 변환

string의 문자 하나를 int로 변환

  • “51”과 같이 string 타입으로 숫자가 표현되어 있을 때
  • string “51” → int 51은 s[0] - ‘0’으로 구현 가능
string s = "51";
int a = str[0] - '0'; // 5
int b = str[1] - '0; // 1

(참고) https://0m1n.tistory.com/18

string 객체를 numeral int로 변환

  • stoi() 함수 이용
  • C++11 이후 버전부터 사용 가능
string s = "51";
int num = stoi(s); // 51

(참고) https://www.freecodecamp.org/korean/news/c-eseo-stringeul-integerro-byeonhwanhaneun-bangbeob-yesi-2/#:~:text=string 객체를 numeral int,를 출력으로 반환합니다.

ASCII 코드와 string

  • ASCII 코드 숫자를 다 외울 수 없으니 참고만 하기
char a = 'a';
cout << (int)a; // 97
cout << (int)a - 97; // 0
cout << (int)a - 'a'; // 0

(참고) https://yunaaaas.tistory.com/101


공백 / 특정 문자 제거하기

remove

  • 원하는 요소 삭제 가능, 그러나 삭제 후 빈 공간이 그대로 남아있음
  • #include <algorithm> 를 까먹지 않게 주의

erase

  • remove 후 남아있는 빈 공간을 삭제
  • #include <string> 을 까먹지 않게 주의
s.erase(remove(s.begin(), s.end(), ' '), s.end());

문자열 split

구분자가 공백일 때

  • istringstream class → #include <sstream>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main(){
	string line = "first second third fourth";
	stringstream sstream(line);
	string token;

	while(getline(sstream, token, ' ')) cout << token << "\n";
	/*
		first
		second
		third
		fourth
	*/
	return 0;
}

구분자가 여러 개일 때

  • find와 substr을 이용함
  • find가 찾지 못하면 string::npos를 반환함
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
	string s = "apple,pear,peach,melon";
	vector<string>v;
	
	int prev_index = 0;
	int cur_index = s.find(","); // s의 처음부터 ","를 찾아서 index를 반환

	while(cur_index != string::npos) {
		string sub_s = s.substr(prev_index, cur_index - prev_index);
		v.push_back(sub_s);
		prev_index = cur_index + 1;
		cur_index = s.find(",", prev_index);
	}

	// 뒤에 ,가 없는 마지막 melon
	v.push_back(s.substr(prev_index, cur_index - prev_index)); 

	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << "\n";
	}
	
	return 0;
}

(참고) https://will-behappy.tistory.com/29

참고 사이트

https://rebro.kr/53
https://ansohxxn.github.io/cpp/chapter17-3/#-용량-capacity

0개의 댓글