std::basic_string
| 헤더 <string>
|
||
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
|
에 정의됨 (1) | |
namespace pmr {
template<
class CharT,
class Traits = std::char_traits<CharT>
> using basic_string =
std::basic_string<CharT, Traits, std::pmr::polymorphic_allocator<CharT>>;
}
|
(2) | (C++17부터) |
클래스 템플릿 basic_string은 문자-유사 객체(TrivialType 및 StandardLayoutType인 비-배열 객체)의 시퀀스를 저장하고 조작합니다. 이 클래스는 문자 유형이나 해당 유형에 대한 연산의 특성에 의존하지 않습니다. 연산의 정의는 템플릿 매개변수( std::char_traitsTraits의 특수화 또는 호환 가능한 특성 클래스)를 통해 제공됩니다.
의 요소는 연속적으로 저장됩니다. 즉,
에 대해, basic_string의 basic_string s에 있는 임의의 &*(s.begin() + n) == &*s.begin() + n에 대해 n이고, [0, s.size())은 값 *(s.begin() + s.size())(널 종결자)을 갖습니다CharT()(C++11부터); 또는 동등하게, 에 대한 포인터는 s[0]의 첫 번째 요소에 대한 포인터를 기대하는 함수에 전달될 수 있습니다(C++11까지)(C++11부터)널-종결 배열의 .CharT
std::basic_string은 AllocatorAwareContainer(단, 사용자 정의 construct/destroy는 요소의 생성/소멸에 사용되지 않음), SequenceContainer 및 ContiguousContainer의 요구 사항을 충족합니다(C++17부터)
.Traits::char_type
만약 Allocator::char_type와 CharT 중 하나라도
|
와 다르면, 프로그램은 ill-formed입니다.
그러나 |
(C++20부터) |
일반적인 문자 유형에 대한 여러 typedef가 제공됩니다:
헤더
<string> | |
| 에 정의됨 유형 | 정의 |
std::string
|
std::basic_string<char>
|
std::wstring
|
std::basic_string<wchar_t>
|
std::u8string 자명하지 않은 기본 생성자(C++20)
|
std::basic_string<char8_t>
|
std::u16string 자명하지 않은 복사 생성자(C++11)
|
std::basic_string<char16_t>
|
std::u32string 자명하지 않은 이동 생성자(C++11)
|
std::basic_string<char32_t>
|
std::pmr::string 자명하지 않은 복사 할당(C++17)
|
std::pmr::basic_string<char>
|
std::pmr::wstring 자명하지 않은 이동 할당(C++17)
|
std::pmr::basic_string<wchar_t>
|
std::pmr::u8string 자명하지 않은 소멸자(C++20)
|
std::pmr::basic_string<char8_t>
|
std::pmr::u16string 자명하지 않은 비교 연산자(C++17)
|
std::pmr::basic_string<char16_t>
|
std::pmr::u32string 자명하지 않은 사전순 비교 연산자(C++17)
|
std::pmr::basic_string<char32_t>
|
템플릿 매개변수
| CharT | - | 문자 타입 |
| Traits | - | 문자 타입에 대한 연산을 지정하는 traits 클래스 |
| Allocator | - | Allocator 내부 저장소 할당에 사용되는 할당자 타입 |
중첩 타입
| 유형 | 정의 | ||||
traits_type
|
Traits
|
||||
value_type
|
CharT
|
||||
allocator_type
|
Allocator
|
||||
size_type
|
|
||||
difference_type
|
|
||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
데이터 멤버
constexpr
size_type
npos
[static]
|
특수 값 size_type ( - 1 ) , 정확한 의미는 컨텍스트에 따라 다름 |
멤버 함수
basic_string
을 생성합니다
(public 멤버 함수) |
|
|
문자열을 파괴하며, 사용된 내부 저장소를 해제합니다
(public member function) |
|
|
문자열에 값을 할당합니다
(public member function) |
|
|
문자열에 문자들을 할당
(public member function) |
|
|
(C++23)
|
문자열에 문자 범위를 할당
(public member function) |
|
연결된 할당자 반환
(public member function) |
|
요소 접근 |
|
|
지정된 문자에 경계 검사와 함께 접근
(public member function) |
|
|
지정된 문자에 접근합니다
(public member function) |
|
|
(
DR*
)
|
첫 번째 문자에 접근
(public member function) |
|
(
DR*
)
|
마지막 문자에 접근
(public member function) |
|
문자열의 첫 번째 문자에 대한 포인터를 반환합니다
(public member function) |
|
|
문자열의 수정 불가능한 표준 C 문자 배열 버전을 반환합니다
(public member function) |
|
|
(C++17)
|
전체 문자열에 대한 수정 불가능한
basic_string_view
를 반환합니다
(public member function) |
반복자 |
|
|
(C++11)
|
시작 부분에 대한 반복자를 반환합니다
(public member function) |
|
(C++11)
|
끝에 대한 반복자를 반환합니다
(public member function) |
|
(C++11)
|
시작 부분으로의 역방향 반복자를 반환합니다
(public member function) |
|
(C++11)
|
역방향 반복자를 끝 위치로 반환합니다
(public member function) |
용량 |
|
|
문자열이 비어 있는지 확인합니다
(public member function) |
|
|
문자 수를 반환합니다
(public member function) |
|
|
최대 문자 수를 반환합니다
(public member function) |
|
|
저장소 예약
(public member function) |
|
|
현재 할당된 저장 공간에 보관할 수 있는 문자 수를 반환합니다
(public member function) |
|
|
(
DR*
)
|
사용하지 않는 메모리를 해제하여 메모리 사용량을 줄입니다
(public member function) |
수정자 |
|
|
내용을 지웁니다
(public member function) |
|
|
문자 삽입
(public member function) |
|
|
(C++23)
|
문자 범위를 삽입합니다
(public member function) |
|
문자 제거
(public member function) |
|
|
끝에 문자를 추가합니다
(public member function) |
|
|
(
DR*
)
|
마지막 문자를 제거합니다
(public member function) |
|
끝에 문자들을 추가함
(public member function) |
|
|
(C++23)
|
문자 범위를 끝에 추가합니다
(public member function) |
|
끝에 문자를 추가합니다
(public member function) |
|
|
문자열의 지정된 부분을 대체합니다
(public member function) |
|
|
(C++23)
|
문자열의 지정된 부분을 문자 범위로 대체합니다
(public member function) |
|
문자 복사
(public member function) |
|
|
저장된 문자 수를 변경합니다
(public member function) |
|
|
(C++23)
|
저장된 문자 수를 변경하고 사용자 제공 연산을 통해 불확정 내용을 덮어쓸 수 있습니다
(public member function) |
|
내용을 교환합니다
(public member function) |
|
검색 |
|
|
주어진 부분 문자열의 첫 번째 발생 위치를 찾습니다
(public member function) |
|
|
부분 문자열의 마지막 발생 위치 찾기
(public member function) |
|
|
문자들의 첫 번째 발생 위치 찾기
(public member function) |
|
|
문자를 찾지 못한 첫 위치 찾기
(public member function) |
|
|
문자들의 마지막 발생 위치 찾기
(public member function) |
|
|
문자 없음의 마지막 위치 찾기
(public member function) |
|
연산 | |
| 두 문자열을 비교합니다 (public 멤버 함수) | |
(C++20) |
문자열이 주어진 접두사로 시작하는지 확인합니다 (public 멤버 함수) |
(C++20) |
문자열이 주어진 접미사로 끝나는지 확인합니다 (public 멤버 함수) |
(C++23) |
문자열이 주어진 부분 문자열이나 문자를 포함하는지 확인합니다 (public 멤버 함수) |
| 부분 문자열을 반환합니다 (public 멤버 함수) | |
(C++26) |
부분 뷰를 반환합니다 (public 멤버 함수) |
비멤버 함수
|
두 문자열, 문자열과
char
, 또는 문자열과
string_view
를 연결합니다.
(함수 템플릿) |
|
|
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20에서 제거됨)
(C++20)
|
두 문자열을 사전식으로 비교합니다.
(함수 템플릿) |
|
std::swap
알고리즘을 특수화합니다.
(함수 템플릿) |
|
|
특정 조건을 만족하는 모든 요소를 지웁니다.
(함수 템플릿) |
|
입력/출력 |
|
|
문자열에 대한 스트림 입력 및 출력을 수행합니다.
(함수 템플릿) |
|
|
I/O 스트림에서 데이터를 읽어 문자열로 저장합니다.
(함수 템플릿) |
|
숫자 변환 |
|
|
(C++11)
(C++11)
(C++11)
|
문자열을 부호 있는 정수로 변환합니다.
(함수) |
|
(C++11)
(C++11)
|
문자열을 부호 없는 정수로 변환합니다.
(함수) |
|
(C++11)
(C++11)
(C++11)
|
문자열을 부동 소수점 값으로 변환합니다.
(함수) |
|
(C++11)
|
정수 또는 부동 소수점 값을
string
으로 변환합니다.
(함수) |
|
(C++11)
|
정수 또는 부동 소수점 값을
wstring
으로 변환합니다.
(함수) |
리터럴
|
인라인 네임스페이스에 정의됨
std::literals::string_literals
|
|
|
(C++14)
|
문자 배열 리터럴을
basic_string
으로 변환
(함수) |
헬퍼 클래스
|
(C++11)
|
문자열을 위한 해시 지원
(클래스 템플릿 특수화) |
추론 가이드 (C++17부터)
반복자 무효화
basic_string
의 요소들을 참조하는 레퍼런스, 포인터, 반복자들은
basic_string
에 대한 비상수 레퍼런스를 인자로 받는 표준 라이브러리 함수들(예:
std::getline
,
std::swap
, 또는
operator>>
) 및 비상수 멤버 함수 호출에 의해 무효화될 수 있습니다. 단,
operator[]
,
at
,
data
,
front
,
back
,
begin
,
rbegin
,
end
, 그리고
rend
는 예외입니다.
참고 사항
C++23까지는
std::basic_string
의 요소를 생성하거나 소멸할 때 사용자 정의
construct
또는
destroy
를 사용해야 하지만, 모든 구현체는 기본 메커니즘만 사용했습니다. 이 요구사항은
P1072R10
을 통해 기존 관행에 맞게 수정되었습니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_string_udls
|
201304L
|
(C++14) | 문자열 타입에 대한 사용자 정의 리터럴 |
__cpp_lib_starts_ends_with
|
201711L
|
(C++20) |
starts_with
,
ends_with
|
__cpp_lib_constexpr_string
|
201907L
|
(C++20) |
std::basic_string
에 대한 constexpr
|
__cpp_lib_char8_t
|
201907L
|
(C++20) |
std::u8string
|
__cpp_lib_erase_if
|
202002L
|
(C++20) |
erase
,
erase_if
|
__cpp_lib_string_contains
|
202011L
|
(C++23) |
contains
|
__cpp_lib_string_resize_and_overwrite
|
202110L
|
(C++23) |
resize_and_overwrite
|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | 컨테이너 호환 범위 를 허용하는 생성, 삽입 및 교체를 위한 멤버 함수 |
예제
#include <iostream> #include <string> int main() { using namespace std::literals; // const char*로부터 문자열 생성 std::string str1 = "hello"; // 문자열 리터럴을 사용하여 문자열 생성 auto str2 = "world"s; // 문자열 연결 std::string str3 = str1 + " " + str2; // 결과 출력 std::cout << str3 << '\n'; std::string::size_type pos = str3.find(" "); str1 = str3.substr(pos + 1); // 공백 이후 부분 str2 = str3.substr(0, pos); // 공백까지의 부분 std::cout << str1 << ' ' << str2 << '\n'; // 첨자 연산자[]를 사용한 요소 접근 std::cout << str1[0] << '\n'; str1[0] = 'W'; std::cout << str1 << '\n'; }
출력:
hello world world hello w World
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 530 | C++98 |
basic_string
요소들의 저장 공간 연속성이
LWG259 에 의해 우연히 요구사항에서 제외됨 |
다시 요구됨 |
| LWG 2861 | C++98 |
value_type
이
Traits::char_type
였음
|
CharT
로 변경됨
|
|
LWG 2994
( P1148R0 ) |
C++98 |
Traits::char_type
[1]
과
Allocator::char_type
중 어느 하나라도
CharT
와 다른 경우 동작이 정의되지 않음
|
이러한 경우 프로그램이
ill-formed로 처리됨 |
참고 항목
|
(C++17)
|
읽기 전용 문자열 뷰
(클래스 템플릿) |
외부 링크
| C++ 문자열 처리 |