본문 바로가기

Program Languege/C/C++

std::string

std::string

 

 c++ 표준라이브러리에서 제공하는 string 클래스이다. 문자열의 처리를 목적으로 정의된 클래스이며 string 헤더파일에 정의되어 있으며 std 네임 스페이스에 포함되어 있다.

 

 템플릿 기반의 클래스이므로 핵심 코드들은 대부분 헤더 파일에 작성되어 있으며 헤더를 열어 보면 소스를 직접 볼 수 있다.

 

Ex>

 

template<class _Elem, class _Traits = char_traits<_Elem>, class _Ax = allocator<_Elem>>

class basic_string;

 

 _Elem은 ANSI문자열을 사용할 것인지 유니코드 문자열을 사용할 것인지 지정하는 역할을 한다. char와 wchar_t로 지정.

 

 _Traits는 basic_string을 특수화 시켜서 속성을 변경하고 하는데 자세한 내용은 모르겠습니다.

 

 문자열 클래스는 가변 길이를 다룰 수 있어야 하므로 본질적으로 메모리를 동적 할당해야 한다. _Ax 인수는 문자열 관리를 위한 메모리를 어떻게 할당하고 해제할 것인가를 지정하는 할당기이다. 디폴트인 allocator<_Elem>은 C++의 할당 연산자인 new, delete를 사용하는데 원한다면 다른 것으로 바꿀 수 있다. malloc, free를 쓰는 방식도 가능하며 초대용량의 메모리를 관리해야 한다면 Win32의 가상 메모리를 직접 할당받는 방식을 쓸 수도 있다. 또는 문자열의 길이가 빈번히 변한다면 미리 다량의 메모리를 확보하여 재할당 회수를 줄이는 최적화된 방법을 구사할 수도 있다. 뒤쪽의 두 인수는 디폴트 객체가 지정되어 있으며 이 객체들도 C++ 표준 라이브러리에 의해 이미 구현되어 있으므로 생략 가능하다. 생략시 무난한 디폴트 객체가 선택되는데 이 때 만들어지는 클래스는 new, delete로 할당되는 널종료 문자열이다. 이 포맷이 가장 일반적이므로 대개의 경우 디폴트만 사용해도 무난한다.

 

typedef basic_string<char> string;

typedef basic_string<wchar_t> wstring;

 

string은 ANSI 문자열이며 wstring은 유니코드 문자열을 표현한다. 두 클래스 모두 첫 번째 인수만 지정했으므로 디폴트에 의해 널 종료 문자열이며 new, delete로 메모리를 관리한다. 프로젝트의 실행 환경에 따라 ANSI와 유니코드를 선택하되 멤버 함수의 목록이나 기능은

같다.

 

 

 

string 객체의 생성자를 살펴보면 다음과 같다.

 

string()

- 디폴트 생성자, 빈 문자열을 만든다.

 

string(const char *s)

- 널 종료 문자열로부터 생성하는 변환 생성자.

 

string(const string &str, int pos = 0, int num = npos)

- 복사 생성자.

 

string(size_t n, char c)

- c를 n개 가득 채움.

 

string(const char *s, size_t n)

- 널 종료 문자열로부터 생성하되 n길이 확보.

 

template<it>string(it begin, it end)

-begin~end사이의 문자로 구성된 문자열 생성.

 

 

 

 

 string 객체의 함수들을 살펴보면 다음과 같다.

 

 

void clear()

- 문자열을 모두 지운다. 빈 문자열("")을 대입하는 것과 효과가 같다.

 

bool empty() const

- 이 객체가 빈 문자열인지 검사한다. 빈 문자열("")과 비교하는 것과 같으며 문자열의 길이가 0이면 true를 리턴한다.

 

const value_type *data() const

- 이 객체의 상수 포인터를 반환한다. 내부 데이터를 그대로 반환하기때문에 이 객체에 NULL문자가 없다면 없는 그대로를 반환한다.

  (c_str()함수와 다른 점.)

  

const value_type *c_str() const

- 이 객체의 상수 포인터를 반환하는데 NULL문자가 없다면 사본을 복사한 후 NULL 문자를 붙여서 반환한다.

 

basic_string<CharType, Traits, Allocator>& append(const value_type* _Ptr)
- 이 객체의 문자열 뒤에 _Ptr 문자를 붙인다. append함수는 여러개의 매개변수를 받을 수 있도록 오버로딩되어있다.

   += 연산자와 같은 기능을 한다.

 

basic_string<CharType, Traits, Allocator>& assign(const value_type* _Ptr)

- 이 객체의 문자열을 _Ptr의 문자열로 변경한다. append함수는 여러개의 매개변수를 받을 수 있도록 오버로딩되어있다.

   = 연산자와 같은 기능을 한다.

size_type capacity( ) const
- 이 객체의 할당되어 있는 공간의 크기를 반환한다. 할당된 공간은 최소한 이 객체가 가지고 있는 문자열의 크기만큼은 할당된다.

   (할당된 크기는 문자열의 크기보다 큰 경우가 많다.)

 

size_type size( ) const
- 이 객체의 문자열의 길이를 반환한다.

 

const_iterator begin( ) const
iterator begin( );
- 두가지 형태가 있으며 이 객체의 문자열의 맨 첫번째 문자의 주소를 iterator형태로 반환한다. iterator는 포인터다?

 

const_iterator end( ) const
iterator end( );
- 두가지 형태가 있으며 이 객체의 문자열의 맨 마지막 문자의 주소를 iterator형태로 반환한다.

 

size_type length( ) const
- 이 객체의 문자열의 길이를 반환한다. size()와 같은 기능을 한다.

 

int compare(const basic_string<CharType, Traits, Allocator>& _Str) const
- 이 객체의 문자열과 _Str의 문자열을 비교하며 객체가 _Str보다 크면 0보다 큰 값, 작으면 0보다 작은 값, 같으면 0을 반환한다.

   compare함수는 여러개의 매개변수를 받을 수 있도록 오버로딩되어있다.

 

size_type find(value_type _Ch, size_type _Off = 0) const

- 이 객체의 문자열에서 _Ch에 해당하는 문자를 찾는다. _Off는 디폴트로 0이 설정되어 있으며 검색을 시작할 인덱스를 말한다.

   find함수는 여러개의 매개변수를 받을 수 있도록 오버로딩되어있다.

 

basic_string<CharType, Traits, Allocator>& insert(size_type _P0, const value_type* _Ptr)
- 이 객체의 문자열에서 _P0에 해당하는 인덱스부터 _Ptr의 문자열을 삽입합니다. insert함수는 여러개의 매개변수를 받을 수 있도록 오

  버로딩되어있다.

 

이 외에도 다양한 함수가 정의되어있다.

 

 

 

 

string 객체에서 미리 정의된 연산자는 다음과 같다.

 

string& operator=(char ch);

string& operator=(const char* str);

string& operator=(const string& other);

- 문자열 대입 연산자.

 

string& operator+=(char ch);

string& operator+=(const char* str);

string& operator+=(const string& other);

- 문자열을 덧붙이는 연산자.

 

ostream& operator<<(ostream& cout, string &s);

 - 문자열을 출력 스트림에 삽입하는 연산자로 ostream에 s의 문자열을 삽입한다. 

 

istream& operator>>(istream& cin, string &s);

- 입력 스트림에서 입력받은 문자열을 s의 문자열에 삽입한다.

 

이 외에도 다양한 연산자 오버로딩이 되어있다.

 

 

 

출처:  http://msdn.microsoft.com/ko-kr/library/vstudio/syxtdd4f(v=vs.100).aspx 

         http://www.soenlab.com/

 

 

 

 

'Program Languege > C/C++' 카테고리의 다른 글

가상함수  (0) 2013.03.19
오버로딩(overloading)과 오버라이딩(overriding)의 차이점  (0) 2013.03.19
구조체 (struct)  (0) 2013.02.27
printf() scanf()  (0) 2013.02.27
함수 오버로딩  (0) 2013.02.27