본문 바로가기

Algorithm/A. Intro & STL

13. String

string은 유사 컨테이너의 하나로 문자열을 다룰 때 많이 사용된다. <string> 헤더파일을 인클루드하면 string을 사용할 수 있다. string의 원형은 basic_string<char>이며 basic_string은 <string>에서 인클루드하는 헤더파일 <bits/basic_string.h>에 정의된 클래스이다. basic_string<char>의 선언과 재정의는 <string>에서 인클루드하는 헤더파일 <bits/stringfwd.h>에서 다음과 같이 하고 있다.

_GLIBCXX_BEGIN_NAMESPACE_CXX11

  template<typename _CharT, typename _Traits = char_traits<_CharT>,
           typename _Alloc = allocator<_CharT> >
    class basic_string;

  /// A string of @c char
  typedef basic_string<char>    string;

 

string의 선언 방법은 다음과 같다:

1. string s;
2. string s(t);
3. string s(t,n);
4. string s(n,c);
5. string s(b,e);
6. string s(p,q);

1번은 빈 문자열을 선언하는 방법이다. 2번과 3번은 문자열 $t$로 문자열 $s$를 생성하는데, 3번의 경우 $t$에서 처음 $n$개의 문자를 가져와 $s$를 생성하게 된다. 4번은 $n$개의 $c$ 문자로 $s$를 생성하는 방법이다. $c$에는 char형 문자 하나(또는 아스키 코드값)이 들어가며, 문자열이 들어가면 컴파일 에러가 발생한다. 5번과 6번은 각각 반복자 구간 $[b, e)$, 포인터 구간 $[p, q)$의 문자로 $s$를 생성하는 방식이다.

 

string의 멤버 함수 역시 앞에서 설명한 표준 컨테이너들의 멤버 함수와 유사한 것들이 많다. 다음 함수들은 앞에서 설명한 것과 유사하므로 이전 글들을 참고하면 된다.

string::push_back
string::pop_back
string::assign
string::reserve
string::resize
string::insert
string::front
string::back
string::size
string::capacity
string::clear
string::empty
string::erase
string::begin
string::end
string::rbegin
string::rend
string::data
string::at
string::contains
string::shrink_to_fit
string::max_size
string::swap
string::get_allocator

string::contains 함수는 C++23 표준이므로 아직까지는 쓸 수 없다. 사실 PS를 할 때는 저기서 string::size, string::begin, string::end를 제외하면 의외로 많이 안 쓴다.

 

다음은 앞에서 설명하지 않았던 함수들이다:

s.append(n,c); s의 끝에 n개의 c 문자를 삽입한다.
s.append(t); s에 t를 이어붙인다.
s.append(t,i,n); s의 끝에 t의 i~i+n-1번째 문자를 삽입한다.
s.append(t,n); s의 끝에 C-string t의 처음 n개의 문자를 삽입한다.
s.append(t); s에 C-string t를 이어붙인다.
s.append(b,e); s의 끝에 반복자(또는 포인터) 구간 [b,e)의 문자들을 삽입한다.
s.append({c1,c2,...,cn}); s의 끝에 n개의 문자 c1,c2,...,cn을 삽입한다.
s.length(); s에 들어 있는 문자의 개수를 반환한다.
s.c_str(); s의 C-string 문자열의 주소를 반환한다.
s.substr(i); s의 i번째 문자부터 마지막 문자까지로 이루어진 문자열을 반환한다.
s.substr(i,n); s의 i번째 문자부터 i+n-1번째 문자까지로 이루어진 문자열을 반환한다.
s.copy(t,n); s의 처음 n개의 문자를 C-string t의 처음 n개의 문자로 한다.
s.copy(t,n,i); s의 i~i+n-1번째 문자를 C-string t의 처음 n개의 문자로 한다.
s.replace(i,n,t); s의 i~i+n-1번째 문자를 t로 바꾼다.
s.replace(b,e,t); 반복자 구간 [b,e)의 문자를 t로 바꾼다.
s.replace(i,n,t,j,m); s의 i~i+n-1번째 문자를 t의 j~j+m-1번째 문자로 바꾼다.
s.replace(b1,e1,b2,e2); 반복자 구간 [b1,e1)의 문자를 반복자 구간 [b2,e2)의 문자로 바꾼다.
s.replace(i,n,t,m); s의 i~i+n-1번째 문자를 C-string t의 처음 m개의 문자로 바꾼다.
s.replace(b,e,t,n); 반복자 구간 [b,e)의 문자를 C-string t의 처음 n개의 문자로 바꾼다.
s.replace(i,n,t); s의 i~i+n-1번째 문자를 C-string t로 바꾼다.
s.replace(b,e,t); 반복자 구간 [b,e)의 문자를 C-stirng t로 바꾼다.
s.replace(i,n,m,c); s의 i~i+n-1번째 문자를 m개의 c 문자로 바꾼다.
s.replace(b,e,n,c); 반복자 구간 [b,e)의 문자를 m개의 c 문자로 바꾼다.
s.replace(i,n,{c1,c2,...,cm}); s의 i~i+n-1번째 문자를 m개의 문자 c1,c2,...,cm으로 바꾼다.
s.replace(b,e,{c1,c2,...,cm}); 반복자 구간 [b,e)의 문자를 m개의 문자 c1,c2,...,cm으로 바꾼다.
s.compare(t); s와 t를 비교한다.
s.compare(i,n,t); s의 i~i+n-1번째 문자를 t와 비교한다.
s.compare(i,n,t,j,m); s의 i~i+n-1번째 문자를 t의 j~j+m-1번째 문자와 비교한다.
s.compare(t); s와 C-string t를 비교한다.
s.compare(i,n,t); s의 i~i+n-1번째 문자를 C-string t와 비교한다.
s.compare(i,n,t,m); s의 i~i+n-1번째 문자를 C-string t의 처음 m개의 문자와 비교한다.
s.starts_with(c); s가 문자 c로 시작하는지 확인한다.
s.starts_with(t); s가 C-string(또는 basic_string_view형 문자열) t로 시작하는지 확인한다.
s.ends_with(c); s가 문자 c로 끝나는지 확인한다.
s.ends_with(t); s가 NULL로 끝나는 C-string(또는 basic_string_view형 문자열) t로 끝나는지 확인한다.
s.find(t); s의 처음부터 문자열 t를 찾는다.
s.find(t,i); s의 i번째 문자부터 t를 찾는다.
s.find(t,i,n); s의 i~i+n-1번째 문자에서 t를 찾는다.
s.find(c); s의 처음부터 문자 c를 찾는다.
s.find(c,i); s의 i번째 문자부터 c를 찾는다.
s.rfind(t); s의 끝부터 문자열 t를 찾는다.
s.rfind(t,i); s의 i번째 문자부터 t를 찾는다.
s.rfind(t,i,n); s의 i~i+n-1번째 문자에서 t를 찾는다.
s.rfind(c); s의 끝부터 문자 c를 찾는다.
s.rfind(c,i); s의 i번째 문자부터 c를 찾는다.
s.find_first_of(t); s에서 t에 존재하는 문자가 처음으로 나오는 위치를 반환한다.
s.find_first_of(t,i); s의 i번째~마지막 문자 중 t에 존재하는 문자가 처음으로 나오는 위치를 반환한다.
s.find_first_of(t,i,n); s의 i~i+n-1번째 문자 중 t에 존재하는 문자가 처음으로 나오는 위치를 반환한다.
s.find_first_of(c); s에서 문자 c가 처음으로 나오는 위치를 반환한다.
s.find_first_of(c,i); s의 i번째~마지막 문자 중 c가 처음으로 나오는 위치를 반환한다.
s.find_first_not_of(t); s에서 t에 존재하지 않는 문자가 처음으로 나오는 위치를 반환한다.
s.find_first_not_of(t,i); s의 i번째~마지막 문자 중 t에 존재하지 않는 문자가 처음으로 나오는 위치를 반환한다.
s.find_first_not_of(t,i,n); s의 i~i+n-1번째 문자 중 t에 존재하지 않는 문자가 처음오로 나오는 위치를 반환한다.
s.find_first_not_of(c); s에서 c가 아닌 문자가 처음으로 나오는 위치를 반환한다.
s.find_first_not_of(c,i); s의 i번째~마지막 문자 중 c가 아닌 문자가 처음으로 나오는 위치를 반환한다.
s.find_last_of(t); s에서 t에 존재하는 문자가 마지막으로 나오는 위치를 반환한다.
s.find_last_of(t,i); s의 i번째~마지막 문자 중 t에 존재하는 문자가 마지막으로 나오는 위치를 반환한다.
s.find_last_of(t,i,n); s의 i~i+n-1번째 문자 중 t에 존재하는 문자가 마지막으로 나오는 위치를 반환한다.
s.find_last_of(c); s에서 c가 마지막으로 나오는 위치를 반환한다.
s.find_last_of(c,i); s의 i번째~마지막 문자 중 c가 마지막으로 나오는 위치를 반환한다.
s.find_last_not_of(t); s에서 t에 존재하지 않는 문자가 마지막으로 나오는 위치를 반환한다.
s.find_last_not_of(t,i); s의 i번째~마지막 문자 중 t에 존재하지 않는 문자가 마지막으로 나오는 위치를 반환한다.
s.find_last_not_of(t,i,n); s의 i~i+n-1번째 문자 중 t에 존재하지 않는 문자가 마지막으로 나오는 위치를 반환한다.
s.find_last_not_of(c); s에서 c가 아닌 문자가 마지막으로 나오는 위치를 반환한다.
s.find_last_not_of(c,i); s의 i번째~마지막 문자 중 c가 아닌 문자가 마지막으로 나오는 위치를 반환한다.
s.npos(); (size_type)(-1)로 정의된 특별한 값이다.

find 함수는 이전에도 나왔지만 string에서는 용법이 다양하기 때문에 다시 설명했다. 뭔가 많지만 자세히 보면 하나의 함수가 여러 종류의 인자를 갖는 경우가 반복되어 나온 것이고, 그 함수들도 서로 비슷한 기능을 하는 경우가 많기 때문에 실제 분량은 그렇게 많지 않다.

 

string::length 함수는 string::size 함수와 동일한 기능을 한다. string::rfind 함수는 역방향 반복자를 사용하기 때문에 문자열 검색도 뒤에서부터 실행되며, 인자로 넘긴 문자열을 뒤집은 문자열이 나오는 위치를 찾는다고 보면 된다. string::npos 함수의 반환값은 size_type 자료형이 담을 수 있는 최댓값을 의미하며, 문자열의 끝이나 내장 함수가 반환할 인덱스를 찾지 못했을 때 반환하는 값으로도 이해할 수 있다.

 

→ solved.ac tag: string

'Algorithm > A. Intro & STL' 카테고리의 다른 글

15. Valarray  (0) 2021.01.24
14. Bitset  (0) 2021.01.19
12. Unordered Container  (0) 2021.01.15
11. Map & Multimap  (0) 2021.01.13
10. Set & Multiset  (0) 2021.01.13