흔히 쓰이는 string 클래스에 대해 알아보자. string 클래스는 string 헤더 파일에 있다.
생성자 | 설명 |
---|---|
string(const char* s) | s가 지시하는 문자열로 초기화. |
string(size_type n, char c) | 문자 c로 모두 초기화된 원소 n개의 객체 생성. |
string(const string & str) | string 객체를 string 객체 str(복사 생성자)로 초기화. |
string() | 크기가 0인 디폴트 string 객체 생성.(디폴트 생성자) |
string(const char* s, size_type n) | s가 지시하는 문자열에서 인덱스 n까지 제외하고 초기화. n이 배열 크기 넘으면 에러 출력. |
string(const string & str, size_type pos, size_type n = npos | string 객체를 string 객체 str의 pos 위치에서 n + 1까지 or 디폴트인 끝까지 초기화한다. |
template<class Iter> string(Iter begin, Iter end) | string 객체를 [begin, end)의 범위에 있는 값들로 초기화한다. begin과 end는 포인터 비슷한 역할을 한다. |
string(string && str) noexcept | string 객체를 string 객체 str로 초기화한다. str은 바뀔 수 있다.(move 생성자.) |
string(initializer_list<char> il) | string 객체를 초기자 목록 il에 있는 문자로 초기화한다. |
string::npos는 일반적으로 가장 큰 unsigned int이다. static 멤버라서 범위 연산자를 통해 쓸 수 있다.
메서드 | 설명 |
---|---|
string operator+(const string & s) | 문자열을 붙인다. |
size_type find(const string & str, size_type pos = 0) const | 호출한 문자열의 pos 위치에서 시작해서 처음으로 발생하는 부분 문자열 str을 검색한다. 부분 문자열이 발견되면 첫 문자의 인덱스를 리턴한다. 그렇지 않으면 string::npos를 리턴한다. |
size_type find(const char * s, size_type pos = 0) const | 호출한 문자열의 pos 위치에서 시작해서 처음으로 발생하는 부분 문자열 str을 검색한다. 부분 문자열이 발견되면 첫 문자의 인덱스를 리턴한다. 그렇지 않으면 string::npos를 리턴한다. |
size_type find(const char * s, size_type pos = 0, size_type n) const | 호출한 문자열의 pos 위치에서 시작하여 s에 있는 처음 n개의 문자로 구성되는 부분 문자열이 처음 나오는 것을 찾는다. 부분 문자열이 발견되면 첫 문자의 인덱스를 리턴한다. 그렇지 않으면 string::npos를 리턴한다. |
size_type find(char ch, size_type pos = 0) const | 호출한 문자열의 pos위치에서부터 시작하여 문자 ch가 처음 나오는 것을 찾는다. 문자가 발견되면 그것의 인덱스를 리턴한다. 그렇지 않으면 string::npos를 리턴한다. |
이와 비슷하게 rfind(), find_first_of(), find_last_of(), find_first_not_of(), find_last_not_of()가 있다. 이들은 find() 메서드와 동일한 오버로딩 매개 변수를 사용한다. rfind() 메서드는 가장 마지막으로 발생한 부분 문자열 혹은 문자를 찾는다. find_first_of() 메서드는 호출한 문자열에서 매개 변수에 있는 문자들 중 가장 먼저 발생하는 문자를 찾는다. 예를 들어
string snake1 = "cobra";
int where = snake1.find_first_of("hark");
여기서 where에는 3이 대입된다. 왜? 문자열 hark 중에 cobra에서 가장 먼저 발생하는 문자는 인덱스 3의 r이다. a는 4로 그 다음이다. 그래서 가장 나중에 발생하는 문자를 찾는 find_last_of() 메서드를 쓰면 인덱스 4가 들어간다. find_first_not_of() 메서드는 호출한 문자열에서 매개 변수에 없는 첫 문자를 찾는다. 따라서
string snake1 = "cobra";
int where = snake1.find_first_not_of("hark");
는 where에 0을 대입한다. 왜? hark에는 c가 없기 때문에 c의 위치를 반환한다.
만약 문자열을 늘려나가면 메모리는 어떻게 될까? 다른 메모리를 침범할 수 있기 때문에, 같은 자리에서 메모리를 늘려 나가는 것은 위험하다. 그러기 보다는 새로운 메모리 블록을 대입하고, 이전의 내용을 새로운 위치로 복사해야 한다. 이 일은 약간 비효율적일 수 있어서, 아예 처음부터 대입 문자열보다 큰 메모리를 할당 받는다. capicity()와 reserve() 메서드를 통해 알아보자. capicty() 메서드는 현재 블록의 크기를 반환하고, reserve() 메서드는 그 크기를 개발자가 임의로 조절할 수 있다.
string str = "Hello World!";
string str1 = "What an amazing World!";
cout << str.capacity() << endl;
cout << str1.capacity() << endl;
str.reserve(50);
cout << str.capacity() << endl;
실행 결과.
아무래도 메모리는 16의 배수 - 1만큼 늘어나는 것 같다.