std :: string과 std :: basic_string의 차이점은 무엇입니까? 그리고 왜 둘 다 필요한가요?


95

std::string과 의 차이점은 무엇입니까 std::basic_string? 그리고 왜 둘 다 필요한가요?

답변:


63

std::basic_string문자 유형에서 문자열을 만들기위한 클래스 템플릿입니다 std::stringtypedef을위한 클래스 템플릿의 전문화 char. 예, 둘 다 필요합니다 (또는 최소한 표준에 의해 요구됨).


17
왜 둘 다 필요한가요?
Mohamed El-Nakib

1
그래서 std :: string이 typedef std :: basic_string <char> std :: string?
unresolved_external

2
@MuhammadAnnaqeeb 2.5 년 늦었지만 짧은 대답은 와이드 문자열 (wstring) (유니 코드, 문자 당 2 바이트, wchar_t) 지원도 제공하는 것입니다.
Andrew

48

std::string의 인스턴스화입니다 std::basic_string<T>.

typedef std::basic_string<char> string

std::basic_string모든 유형의 문자열에 대해 유사한 인터페이스가 필요합니다 ( wstring예 :


33
적절한 용어는 "전문화"입니다. string전문화 입니다 basic_string.
AnT 2009

3
그것에 대해 논쟁 할 수 있다고 생각합니다. "전문화"는 일반적으로 상속을 나타내는 데 사용됩니다. 템플릿 화 된 {class | function}은 템플릿 인수를 대체하여 인스턴스화됩니다. 부분 템플릿 전문화가 있지만 여기에서는 사용되지 않습니다.
pmr

5
파생 클래스를 '전문화'라고하는 것은 '전문화'를 덜 공식적으로 사용하는 것입니다. '전문화'라는 단어는 표준에서 전혀 이와 같이 사용되지 않지만 (확실히 확신합니다) 템플릿 전문화를 설명하는 데 광범위하게 사용됩니다. 템플릿 전문화의 이름은 강제 및 암시 적 인스턴스화를하지 않는 컨텍스트에서 사용할 수 있으므로 전문화 및 인스턴스화는 별도의 개념입니다. 템플릿 전문화 (특정 매개 변수 집합이있는 템플릿의 이름)뿐만 아니라 부분 전문화 (클래스 템플릿 만 해당) 및 명시 적 전문화도 있습니다.
CB Bailey

1
여기서 "전문화"를 사용하면 오해의 소지가 있습니다. 템플릿 전문화는 특정 의미 (상속과 무관)를 가지고 있지만 여기서 사용되는 것은 아닙니다. std :: string은 typedef보다 많거나 적지 namespace std { typedef basic_string<char> string; }않습니다 . 기술적으로는 실제로 인스턴스화도 아니지만 적어도 더 가깝습니다 (정의에 따라 인스턴스화는 인스턴스를 만들고 typedef는 인스턴스가 아닌 이름 만 만듭니다. ).
Jerry Coffin

3
@Charles : (템플릿 포함) "특수화"는 일반적으로 단순 인스턴스화로 끝나는 typedef가 아니라 부분적 전문화 또는 명시 적 전문화를 나타 내기 때문에 오해의 소지가 있습니다 .
Jerry Coffin

17

A std::stringstd::basic_string유형이 인 템플릿 의 인스턴스화 입니다 char. 와이드 문자의 문자열 char과 같이 외에 사물의 문자열을 만들 수 있도록 둘 다 필요합니다 std::basic_string<wchar_t>. 또는 32 비트 요소가있는 문자열을 원하는 경우 std::basic_string<unsigned int>.


2
나는 이것이 가장 많이 뽑힌 대답이어야한다고 생각합니다. 유형 std::basic_string없이 인스턴스화 할 수없는 사용 사례를 제공합니다 char.
hlin117
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.