[Basic C++] #63_string
C++에서 제공하는 string 클래스에 대해 알아보겠습니다.
Overview
- 정의
- 선언
- 멤버 함수
- 그 외 특징
- 예제
#0. 정의
1. string 클래스
- C++에서 제공하는 string 클래스는 문자열을 다루기 위한 클래스입니다. string 클래스는 문자열을 저장하고 다양한 조작 함수를 제공합니다. string 클래스를 활용하면 복잡한 작업들을 직접 구현할 필요가 없고, 효율적으로 문자열을 다룰 수 있습니다.
- C언어의 char* 혹은 char[]과 달리, 문자열 끝에 '\0'이 들어있지 않습니다.
#1. 선언
1. 헤더
#include <string>
2. 선언 혹은 초기화
#include <string>
using namespace std;
int main()
{
string str("Hello World!");
string str2 = "Hello World!";
}
Details
- 생성자를 통해 string 클래스를 초기화할 수 있습니다.
- 대입 연산자를 통해 string 클래스를 초기화할 수 있습니다.
#2. 멤버 함수
1. 접근
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str("Hello World");
cout << str.at(0) << endl;
cout << str[0] << endl;
cout << str.front() << endl;
cout << str.back() << endl;
return 0;
}
Details
- 문자열의 임의의 항목에 접근하기 위해 at()을 활용합니다. at()은 범위 검사를 수행하여 지정된 위치가 문자열의 범위를 벗어나면 예외를 뱉습니다. 안전한 접근 방법이지만, 수행 속도가 비교적 느립니다.
- 문자열의 임의의 항목에 접근하기 위해 operator[]를 활용합니다. operator[]는 범위 검사를 수행하지 않습니다. operator[]는 범위 검사를 수행하지 않아 비교적 성능이 좋습니다
- 문자열의 첫 번째 항목을 반환합니다.
- 문자열의 마지막 항목을 반환합니다.
2. 크기
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str("Hello World");
cout << str.size() << endl;
cout << str.length() << endl;
cout << str.capacity() << endl;
str.resize(2);
str.reserve(10);
str.clear();
bool IsEmpty = str.empty();
return 0;
}
Details
- size() 함수는 문자열 항목들의 개수를 반환합니다-"abcde"는 5를 반환합니다.
- length() 함수는 위와 동일합니다.
- capacity() 함수는 문자열에 할당된 메모리 크기를 반환합니다.vector 컨테이너와 동일하게 string은 메모리 할당을 여유롭게 합니다.
- resize(n) 함수는 문자열의 길이를 n으로 변경합니다. 만약 n이 기존의 길이보다 작을 경우, 남은 항목들을 버립니다.
- reserve(n) 함수는 문자열의 메모리 할당을 예약합니다.
- clear() 함수는 말 그대로 문자열을 모두 지웁니다.
- empty() 함수는 문자열이 비어있는지 여부를 반환합니다.
3. 삽입, 제거
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str("Hello World");
str[0] = 'N';
str.push_back('S');
str.pop_back();
return 0;
}
Details
- operator[]를 활용해 문자를 문자열에 삽입합니다.
- push_back(char c)을 활용해 문자열의 마지막에 c를 삽입합니다.
- pop_back()을 활용해 문자열의 마지막 항목을 꺼냅니다.
3. 그 외 유용한 함수들
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str("Hello World");
string str2("Not Hello World");
// #1. string substr(size_t index = 0, size_t len = npos) const;
str = str.substr(0, 5);
// #2. string& replace(size_t index, size_t len, const string& str)
str.replace(0, 2, str2);
// #3. int compare(const string& str2) const;
int IsEqual = str.compare(str2); // 같다면 0을 반환, 같지 않으면 그 외 값을 반환
// #4. size_t copy(char* arr, size_t len, size_t index = 0) const;
char str3[] = "Hello Hello World";
str.copy(str3, 4, 10);
// #5. void swap(string& str1, string& str2);
str.swap(str2);
return 0;
}
Details
- substr() 함수는 문자열의 부분 문자열을 반환합니다. 이때, 첫 번째 인자는 문자열의 인덱스이며, 두 번째 인자는 substr 하고자 하는 문자열 범위의 마지막 인덱스가 아니라, 단순히 substr 하고자 하는 문자열의 개수입니다.
- replace() 함수는 문자열의 특정 범위를 다른 문자열로 대체합니다.
- compare() 함수는 두 문자열을 비교하여 같은 문자열들이라면 0을 반환하고, 다르다면 그 외 값을 반환합니다.
- copy() 함수는 인자로 전달받은 문자열을 다른 문자열의 특정 범위 에 복사합니다. 이때, 인자로 전달 받는 문자열은 C스타일의 char[] 혹은 char* 이므로 주의해야합니다. 두 번째, 그리고 세 번째 인자도 위의 것들과 순서가 다릅니다!
- swap() 함수는 인자로 전달 받은 서로 다른 문자열들을 바꿔줍니다.
#3. 그 외 특징
1. operator []
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string str = "Hello World!";
vector<int> v = { 1, 2, 3, 4, 5 };
// 1. string의 operator [] 활용
if (!str.empty())
{
cout << str[0] << endl;
}
// 2. vector의 operator [] 활용
if (!v.empty())
{
cout << v[0] << endl;
}
// 1. string의 Out Of Bounds 인덱스 접근
if (!str.empty())
{
cout << str[12]; // 에러가 발생하지 않습니다!
}
// 2. vector의 Out Of Bounds 인덱스 접근
if (!v.empty())
{
cout << v[5] << endl; // 에러가 발생합니다!
}
return 0;
}
Details
- C++의 vector 클래스의 경우 opeator[]를 통해 범위 밖 인덱스를 접근하면, 미정의 동작이 발생합니다.
- C++의 string 클래스의 경우 operator[]를 통해 범위 밖 인덱스를 접근하면, 문자열의 끝을 나타내는 null 문자를 반환합니다. 따라서, string 클래스의 범위 밖 인덱스 접근은 미정의 동작을 발생시키지 않습니다.
#3. 예제
1. 예제-1
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> ingredient) {
int answer = 0;
string tmpStr = "";
string str = "1231";
if(ingredient.size() < 4)
return 0;
for(int i=0; i<ingredient.size(); i++)
{
tmpStr.push_back(ingredient[i]+'0');
if(tmpStr.size() >= 4)
{
int startIndex = tmpStr.size()-4;
string tmpSubStr = tmpStr.substr(startIndex, 4);
if(tmpSubStr == str)
{
tmpStr.erase(begin(tmpStr)+startIndex, end(tmpStr));
answer++;
}
}
}
return answer;
}
Details
- 프로그래머스의 Level1 문제들 중 "햄버거 만들기" 문제입니다.
- 먼저, size() 함수를 통해 문자열의 길이를 확인하는 코드가 보입니다.
- 그리고 push_back() 함수를 통해 문자열의 마지막에 항목을 추가하는 코드도 있습니다.
- substr() 함수를 통해 문자열의 특정 범위를 substring 하는 코드도 보입니다.
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #65_getline() (0) | 2023.04.03 |
---|---|
[Basic C++] #64_stack (0) | 2023.04.03 |
[Basic C++] #62_erase(), 주의할 점 (0) | 2023.04.02 |
[Basic C++] #29_Set, STL 컨테이너 (0) | 2022.11.19 |
[Basic C++] #22_참조형 변수 (0) | 2022.10.12 |