알고리즘 문제를 풀면서 사용했을 때 편리한 라이브러리들과 그 사용법을 기록해 두려고 한다.
1. String Library
문자열 조작에 필요한 함수가 들어 있는 클래스이다.
#include <string> //으로 선언
1) string 초기화
1
2
3
4
5
6
7
8
9
10
11
|
//선언과 동시에 초기화
string str1 = "s1";
string str2("s2");
//선언과 초기화 각각
string str4;
str4.assign("s4");
//동적 할당
string *pstr5 = new string("s5");
delete pstr5;
|
cs |
2) 해당 문자열의 크기 반환
1
2
3
4
|
//size와 length 모두 동일하게 문자열 크기 반환.(공백 문자 포함)
string str1 = "s1";
cout << str1.size() << '\n';
cout << str1.length() << '\n';
|
cs |
동일한 값을 반환하지만, 의미는 다르다. length의 경우 문자열의 길이를 반환하고, size는 해당 객체가 메모리에서 사용하는 크기를 반환한다.
여기서 문자열의 마지막에 null문자가 들어가는데, length의 경우 null문자까지의 길이를 제외한 실제 문자열의 길이를 반환한다.
--> 그렇다면 size는 해당 객체가 메모리에서 사용하는 크기를 반환한다고 했는데, 저장되는 문자열의 메모리 사이즈는 실제 할당한 문자열 데이터 사이즈 + null문자이다. 그러면 size는 왜 null문자가 포함되는 메모리 크기가 아닌 실제 할당한 문자열 사이즈만 반환하는 것일까?
solution
기존 c언어에서는 문자의 나열과 마지막에 '\0' 을 넣어 문자열을 표현한다.
그에 비해 std::string에서는 문자의 나열과 길이로 문자열을 표현한다. 따라서 마지막에 '\0'이 없어도 문자열의 끝을 알 수 있다.
예를 들어, 'str1'을 std::string 변수에 넣으면 문자열의 길이 4와 문자들 s, t, r, 1이 저장된다. 즉, operator[]을 통해 idx 5에 접근하려 한다면 std::out_of_range 예외를 발생시킨다. (이 예외는 표준 사항이 아니어서 발생하지 않을 수도 있다.)
하지만 실제로 std::string에서는 null로 끝내는 문자열과의 호환성을 위해 메모리 상에 '\0'을 포함해 문자열을 저장한다. 하지만 operator[]을 통한 '\0' 접근을 허용하지 않는다.
디버거는 '\0'이 저장된 것을 보여주지 않는다. 문자열 끝의 '\0'를 확인하고 싶다면 c_str()을 사용해 '\0'로 끝나는 문자열을 가져오면 된다.
정리하면, std::string은 문자열을 메모리에 저장할 때 실제론 '\0'을 포함하지만 개념상 '\0'의 접근을 허용하지 않는다. 또한 문자열의 길이를 이미 갖고 있어 '\0' 탐색을 통해 길이를 계산하지 않아도 된다는 것이다.
문자열 객체의 크기를 조절하고 싶으면 resize()함수를 사용한다
1
2
3
4
|
//str1의 크기를 5로 바꾼다. 원래 크기가 5보다 크면 남는 부분은 버리고, 5보다 작으면 남는 공간을 +로 채운다.
//조건이 없을 경우 빈공간으로 채워짐.
string str1 = "hhhhiiii";
str1.resize(5, '+');
|
cs |
3. 인덱스 참조
1
2
3
4
5
|
string str1 = "himynameispenguin";
cout << str1[3] << '\n';
cout << str1.at(3) << '\n';
cout << str1.front() << '\n';
cout << str1.back() << '\n';
|
cs |
문자열에서 특정 위치의 문자를 가져오려면 배열에서 참조하면 된다.(배열명[idx], 배열명.at(idx) )
front()는 해당 문자열의 가장 앞 문자, back()는 해당 문자열의 가장 뒤 문자(c_str()로 문자열을 가져오지 않은 경우 '\0'문자 제외 가장 마지막 문자)를 가져온다.)
4. 문자열 비교
아스키 코드를 기준으로 비교한다. 즉, "A" < "a"이다.
비교 문자로는 '==', '!=', '<', '<=', '>', '>='이다.
1
2
3
4
5
6
|
//str1 가장 처음 문자가 str2 처음 문자보다 크므로 else문이 출력된다.
string str1 = "hello";
string str2 = "Hello";
if(str1 < str2) cout << "str2 is bigger than str1" << '\n';
else cout << "str1 is bigger than str2" << '\n';
|
cs |
참고 링크
https://min-zero.tistory.com/20#:~:text=length%EC%9D%98%20%EA%B2%BD%EC%9A%B0%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98,%EC%9D%98%20%EA%B8%B8%EC%9D%B4%EB%A7%8C%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4.
https://hashcode.co.kr/questions/5777/c-string-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EC%A0%80%EC%9E%A5%ED%95%A0-%EB%95%8C%EB%8A%94-%EB%84%90%EB%AC%B8%EC%9E%90%EA%B0%80-%EC%97%86%EB%82%98%EC%9A%94
'이론 공부 내용 정리 > 알고리즘' 카테고리의 다른 글
c++ 시간 초과시 사용하는 코드에 대한 이해 (0) | 2022.07.30 |
---|---|
1. c++ 라이브러리<stack> (0) | 2022.07.27 |
백준 1107_리모컨 (0) | 2022.07.22 |
백준 1931_회의실 배정 (0) | 2022.07.17 |
백준 11047_동전 0 (0) | 2022.07.14 |