언어/Basic C++

[Basic C++] #63_string

Hardii2 2023. 4. 3. 10:06

 

[Basic C++] #63_string

 

C++에서 제공하는 string 클래스에 대해 알아보겠습니다.

 


 

Overview

 

  1. 정의
  2. 선언
  3. 멤버 함수
  4. 그 외 특징
  5. 예제

 

#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

 

  1. 생성자를 통해 string 클래스를 초기화할 수 있습니다.
  2. 대입 연산자를 통해 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

 

  1. 문자열의 임의의 항목에 접근하기 위해 at()을 활용합니다. at()은 범위 검사를 수행하여 지정된 위치가 문자열의 범위를 벗어나면 예외를 뱉습니다. 안전한 접근 방법이지만, 수행 속도가 비교적 느립니다.
  2. 문자열의 임의의 항목에 접근하기 위해 operator[]를 활용합니다. operator[]는 범위 검사를 수행하지 않습니다. operator[]는 범위 검사를 수행하지 않아 비교적 성능이 좋습니다 
  3. 문자열의 첫 번째 항목을 반환합니다.
  4. 문자열의 마지막 항목을 반환합니다.

 

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

 

  1. size() 함수는 문자열 항목들의 개수를 반환합니다-"abcde"는 5를 반환합니다.
  2. length() 함수는 위와 동일합니다.
  3. capacity() 함수는 문자열에 할당된 메모리 크기를 반환합니다.vector 컨테이너와 동일하게 string은 메모리 할당을 여유롭게 합니다.
  4. resize(n) 함수는 문자열의 길이를 n으로 변경합니다. 만약 n이 기존의 길이보다 작을 경우, 남은 항목들을 버립니다. 
  5. reserve(n) 함수는 문자열의 메모리 할당을 예약합니다.
  6. clear() 함수는 말 그대로 문자열을 모두 지웁니다.
  7. 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

 

  1. operator[]를 활용해 문자를 문자열에 삽입합니다.
  2. push_back(char c)을 활용해 문자열의 마지막에 c를 삽입합니다.
  3. 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

 

  1. substr() 함수는 문자열의 부분 문자열을 반환합니다. 이때, 첫 번째 인자는 문자열의 인덱스이며, 두 번째 인자는 substr 하고자 하는 문자열 범위의 마지막 인덱스가 아니라, 단순히 substr 하고자 하는 문자열의 개수입니다.
  2. replace() 함수는 문자열의 특정 범위를 다른 문자열로 대체합니다. 
  3. compare() 함수는 두 문자열을 비교하여 같은 문자열들이라면 0을 반환하고, 다르다면 그 외 값을 반환합니다.
  4. copy() 함수는 인자로 전달받은 문자열을 다른 문자열의 특정 범위 에 복사합니다. 이때, 인자로 전달 받는 문자열은 C스타일의 char[] 혹은 char* 이므로 주의해야합니다. 두 번째, 그리고 세 번째 인자도 위의 것들과 순서가 다릅니다!
  5. 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 하는 코드도 보입니다.