C++ 프로그래머가 끊임없이 개발하는 편의기능 중에서 텍스트를 조작하는 기능은 거의 string이라고 부르는 라이브러리에 포함되어 있다. C 프로그래밍 언어는 기본적인 문자열을 지원한다. C의 NTBS를 기반으로 그 위에 수 많은 코드가 구축되어 왔다 (NTBS (널-종료 바이트 문자열, 또한 NTB 문자열도) 문자열 연속으로서 가장 마지막 원소의 값이 0이다. 즉, 종료 널 문자로 정의되어 있다. 연속열에서 값을 0으로 가지는 다른 문자는 없다.).
C++는 텍스트를 처리하기 위하여 std::string 유형을 제공한다. C++에서는 NTB 문자열을 조작하는 전통적인 C 라이브러리 함수보다는 string 객체를 사용한다. C 프로그램에서 많은 문제들은 버퍼 범람과 경계 에러 그리고 할당 문제 때문에 야기되며 추적해 들어가 보면 대부분 전통적인 C 문자열 라이브러리 함수를 부적절하게 사용했기 때문임을 알 수 있다. C++ 문자열 객체를 사용하면 이런 문제들을 대부분 피할 수 있다.
실제로 string 객체는 클래스 유형의 변수이며 그런 의미에서 cin과 cout 같은 스트림 객체와 비교된다. 이 절은 string 유형의 객체를 다룬다. 그 정의와 사용법에 초점을 둔다. string 객체를 사용할 때 멤버 함수 구문을 사용하는 것이 보통이다.
stringVariable.operation(argumentList)
예를 들어 string1과 string2가 std::string 유형의 변수이면
string1.compare(string2)
두 문자열을 비교할 수 있다.
일반적인 멤버 함수 말고도 string 클래스는 연산자(operator)도 광범위하게 제공한다. 예를 들어 할당 연산자(=)와 비교 연산자(==)가 있다. 연산자는 코드를 이해하기 쉽게 해 주고 비교용 멤버 함수보다 더 많이 사용된다. 다음과 같이 작성하는 것보다는
if (string1.compare(string2) == 0)
다음과 같이 사용하는 것이 보통이다.
if (string1 == string2)
string 유형의 객체를 정의하고 사용하려면 소스에 <string> 헤더를 포함해야 한다. 단순히 문자열 유형을 선언(declare)하는 정도라면 iosfwd 헤더를 포함해도 된다.
std::string외에도 다음과 같은 문자열 유형이 정의되어 있다.
std::wstring, wchar_t 문자로 구성된 문자열 유형;
std::u16string, char16_t 문자로 구성된 문자열 유형;
std::u32string, char32_t 문자로 구성된 문자열 유형.
string::npos 값을 돌려준다. 이 값은 string::size_type 유형의 상징적 값으로서 (실용적 목적으로) unsigned int이다.
string 객체를 인자로 받는 모든 string 멤버는 char const * (NTBS) 인자도 받는다. 이것은 string 객체를 받는 연산자들에도 적용된다.
어떤 string 멤버는 반복자(iterator)를 사용한다. 반복자는 18.2절에 정식으로 소개한다. 반복자를 사용하는 멤버 함수는 다음 절에 나열한다 (5.2). 그러나 반복자 개념 자체는 이 장에 더 이상 다루지 않는다.
string 클래스는 많은 멤버와 연산자를 지원한다. 간략하게 그의 능력을 이 절에 개관해 보고 다음 절에서 더 자세하게 다루겠다. 요약해 말하면 C++가 문자열을 처리하는 능력은 대단히 뛰어나기 때문에 C 라이브러리에 의존하여 텍스트를 처리해야 할 이유가 거의 없다. C++ 문자열은 필요한 모든 메모리 관리를 처리하고 그리하여 C 프로그램에서 문제의 근원이 되는 메모리 관련 문제를 뿌리뽑을 수 있다. 그렇지만 string에는 그에 상응하는 대가가 따른다. 문자열 클래스의 광범위한 능력 때문에 오히려 메모리 문제가 더 심각해질 수도 있다. 그의 모든 특징을 배우고 익히기가 어려울 뿐더러 결국 예상한 모든 것이 다 갖추어져 있는 것도 아니라는 사실을 알게 될 것이다. 예를 들어 std::string은 대소문자를 구별해 비교하지 못한다. 생각보다 구현하기도 그렇게 쉽지 않다. 분명히 있기는 하지만 약간 은밀한 것도 있어서 이 시점에서 거기에 파고 들기에는 좀 이른 감이 있다. 대신에 C의 표준 라이브러리가 유용한 기능을 제공한다는 사실을 깨닫기를 바란다. 우리는 이미 그 한계를 잘 알고 있고 함정을 잘 피할 수도 있다. 그래서 지금 당장은 다음과 같이 std::string 객체인 str1과 str2 두 문자열의 내용을 대소문자를 구별하여 전통적으로 비교하는 것이면 충분하다.
strcasecmp(str1.c_str(), str2.c_str());
string 클래스는 다음 기능을 제공한다.
문자열 객체를 정의하면 언제나 적절하게 초기화된다. 다른 말로 언제나 유효한 상태에 있다. string 클래스는 빈 채로 초기화되거나 아니면 기존의 텍스트가 초기화에 이용될 수도 있다.
문자열에 새로운 값을 줄 수 있다. 새 값은 멤버 함수를 사용하여 할당할(assign) 수 있지만 평범한 할당 연산자(=)를 사용해도 된다. 게다가 문자열 버퍼에 할당하는 것도 지원한다.
문자열 객체의 내용을 부분적으로 또는 전체적으로 C 문자열처럼 번역할 수 있지만 그 문자열의 내용은 또한 일련의 날 이진 바이트로 처리할 수도 있어서 반드시 값이-0인 문자로 종료할 필요가 없다. 게다가 평범한 문자와 C 문자열을 std::string을 받는 곳에 사용할 수 있는 경우도 많다.
문자열에 저장된 문자는 친숙한 인덱스 연산자([ ])를 사용하여 개별적으로 접근할 수 있어서 문자열 가운데에 있는 정보에 접근하거나 변경할 수 있다.
친숙한 논리 비교 연산자==, !=, <, <=, >그리고>=를 사용하여 C의 문자열(NTB 문자열)과 비교할 수 있다. 또한 더 세심하게 비교를 수행하는 멤버 함수가 있다.
문자열의 내용을 여러가지 방식으로 변경할 수 있다. 문자열 객체에 정보를 추가하는 연산자가 있고, 문자열 가운데에 정보를 삽입하는 연산자 또는 문자열의 내용을 (부분적으로) 교체하거나 삭제하는 연산자가 있다.
문자열의 교체 능력 덕분에 바이트 단위로 복사할 필요없이 근본적으로 두 문자열 객체의 내용을 교환할 수 있다.
문자열 객체 안 특징 위치에서 시작해 문자의 위치나 문자 집합 또는 일련의 문자들을 검색할 수 있으며 정방향이나 역방향으로 검색할 수 있다.
몇가지 자잘한 편의기능이 제공된다. 문자열이 비어 있는지 아니면 그 길이가 얼마나 되는지 질의해 볼 수 있다. 그러나 문자열 객체는 길이가 바뀌기도 한다.
스트림으로부터 문자열을 추출하거나 삽입할 수 있다. 평범한 문자열 추출 말고도 텍스트 파일 한 줄을 버퍼 범람의 위험없이 읽어 들일 수 있다. 추출과 삽입은 스트림에 기반하기 때문에 I/O 기능은 장치에 얽매이지 않는다.
object)는 언제나 문자열(string)-객체를 뜻한다.
argument)는 언제나 string const & 아니면 char const *이다. 인자(argument)의 내용은 그 인자를 처리하더라도 절대 바뀌지 않는다.
opos는 object 문자열 안에서의 상대 주소를 가리킨다.
apos는 인자(argument) 안에서의 상대 주소를 가리킨다.
on은 object 안의 문자의 갯수를 나타낸다 (opos에서 시작됨);
an은 인자(argument) 안의 문자의 갯수를 나타낸다 (apos에서 시작됨).
opos와 apos 모두 기존의 상대 주소를 가리켜야 한다. 그렇지 않으면 예외가 발생한다 (제 10장). 대조적으로 an과 on은 실제 문자의 갯수를 초과해도 된다. 이 경우 가능한 문자만 고려할 뿐이다.
많은 멤버가 on과 an 그리고 apos에 대하여 기본값이 선언되어 있다. 어떤 멤버는 opos에도 기본값을 선언한다. 기본 상대주소 값은 0이다. on과 an의 기본값은 string::npos이며 이 값은 `요구한 문자의 갯수를 넘어 문자열의 끝에 도달함'이라고 이해하면 된다.
끝에서 연산을 시작하여 문자열 객체의 내용을 거꾸로 처리하는 멤버에 대하여 opos의 기본 값은 그 객체의 마지막 문자의 인덱스이고 on은 기본값으로 opos + 1과 동등하며 opos에서 끝나는 부문자열의 길이를 나타낸다.
아래에 제시하는 멤버 함수를 개관해 보면 이 모든 매개변수가 따로 언급하지 않는 한, 기본값을 받는다고 요약해도 좋을 것이다. 물론 함수가 기존의 인자들을 넘어서서 인자를 더 요구하면 기본 인자 값은 사용할 수 없다.
어떤 멤버 함수는 첫 인자가 char const * 유형이기를 기대한다. 그러나 그렇지 않다고 할지라도 매개변수가 std::string으로 정의되어 있다면 첫 인자는 언제든지 char const * 유형이 될 수 있다.
여러 멤버 함수가 반복자(iterator)를 받는다. 18.2절에 반복자(iterator)의 기술적 측면을 다루겠지만 이 시점에는 무시해도 읽는 흐름을 깨지 않는다. apos와 opos처럼 반복자도 문자열 객체의 내용 안에서 기존의 위치 또는 기존의 문자 범위를 가리켜야 한다.
인덱스를 계산하는 모든 string 멤버 함수는 실패하면 미리 정의된 string::npos를 돌려준다.
C++14 표준은 s라는 기호상수 접미사를 제공한다. 이 접미사는 ("hello world"와 같이) 문자열 기호상수가 사용될 때 std::string 상수라는 사실을 나타낸다. using namespace std를 선언한 후에, 꼭 찝어 말해 다음과 같이 using namespace std::literals::string_literals로 선언한 후에 사용할 수 있다. std::string 객체의 문맥에서 사용될 때는 문자열 기호상수 접미사는 거의 필요하지 않지만 auto 키워드와 함께 사용될 때는 편리하다. 예를 들어 auto str = "hello world"s는 std::string str을 정의하는 반면에 기호상수 접미사를 생략하면 char const *로 정의된다.
string 생성자를 사용할 수 있다.
object를 빈 문자열로 초기화한다. 인자를 지정하지 않고string을 정의해도 된다.
object를count개의ch문자로 초기화한다. 약점이 있다: 이 생성자를 이용해 문자열 객체를 초기화하려면 활괄호 변형을 사용하지 마라. 초기화 리스트 생성자를 선택하는 실수를 하지 않으려면 아래에 보여주는 생성자를 사용하라.
object를argument로 초기화한다.
object를argument의 내용으로apos인덱스 위치부터 시작하여 최대an개의argument문자로 초기화한다.
object를 두InputIterators사이에 정의된 문자 범위로 초기화한다.
string object(std::initializer_list<char> chars):초기화 리스트에 지정된 문자로object를 초기화한다. 활괄호 초기화를 사용하면 직접적으로 초기화할 수도 있다. 다음은 두 가지 형태를 보여주는 예이다:string str1({'h', 'e', 'l', 'l', 'o'}); string str2{ 'h', 'e', 'l', 'l', 'o' };
string(std::initializer_list<char>)으로 문자열을 생성하는 방법이 있다. 초기화 리스트(initializer_list)로 std::string 객체를 생성한다. string oops{ 1, 'x' }와 같이 지정하면 문자 두개를 원소로 가진 문자열을 구성한다. 아스키 코드로 하나는 1이고 다른 하나는 'x'이다. x 문자 한 개로 구성된 문자열이 전혀 아님을 주의하라. std::string(size_t count, char c)을 의도할 때 활괄호로 초기화하지 않도록 주의하라.
begin-반복자는 첫 개체를 가리키고 end-반복자는 범위를 벗어나 마지막 개체를 넘어선 곳을 가리킨다. 둘 사이의 차이는 반복자-범위에 있는 개체의 갯수와 같다.
반복자는 총칭 알고리즘의 문맥에서 중요한 역할을 한다 (제 19장). std::string 클래스에는 다음 반복자 유형이 정의되어 있다.
string::iterator 그리고 string::const_iterator: 이 반복자들은 정방향 반복자이다.const_iterator는string const객체가 돌려준다. 평범한iterator는 비-const 문자열 객체가 돌려준다. 반복자(iterator)가 가리키는 문자들을 변경할 수 있다.
string::reverse_iterator 그리고 string::reverse_const_iterator: 이 반복자들도 정방향 반복자(forward iterator) 이지만 증가시키면 이전 문자로 이동한다. 그 외에 각각string::iterator와string::const_iterator에 비교된다.
string 객체는 멤버 함수로 조작할 수 있지만 연산자로도 조작할 수 있다. 연산자를 사용하면 코드 모습이 더 자연스럽다. 연산자를 사용할 수 있고 멤버 함수와 기능이 같을 경우는 사실상 언제나 연산자를 사용한다.
다음의 연산자들을 string 객체에 사용할 수 있다 (예제에서 `객체'와 `인자'는 기존의 std::string 객체를 가리킨다).
C 또는 C++ 문자열을string객체에 할당할 수 있다. 할당 연산자는 왼쪽의 피 연산자를 돌려준다. 예제:object = argument; object = "C string"; object = 'x'; object = 120; // object = 'x'와 같다.
산술 추가 할당 연산자와 덧셈 연산자는 텍스트를string객체에 추가한다. 반영 할당 연산자는 자신의 왼쪽 피연산자를 돌려주고 덧셈 연산자는 그의 결과를 임시 문자열 객체 안에 돌려준다. 덧셈 연산자를 사용할 때 왼쪽 피연산자 아니면 오른쪽 피연산자는 반드시std::string객체가 되어야 한다. 다른 피연산자는char유형 즉, C 문자열 또는 C++ 문자열이면 된다. 예를 들어:object += argument; object += "hello"; object += 'x'; // 병합 표현식 가능 argument + otherArgument; // 두개의 std::string 객체 argument + "hello"; // +를 사용할 때는 적어도 하나는 "hello" + argument; // std::string이어야 한다. argument + 'a'; // 병합 표현식 가능 'a' + argument;
인덱스 연산자를 사용하면object의 문자들을 하나하나 열람할 수 있다. 또는 const 문자열 객체가 아니라면 새 값을 문자에 할당할 수 있다. 범위 점검은 하지 않는다. 범위 점검을 하려면at()멤버 함수를 사용하면 된다. 이 연산자는char &또는char const &를 돌려준다. 예제:object[3] = argument[5];
논리 비교 연산자를 두 개의 문자열 객체 또는 하나의 문자열 객체와 C 문자열에 적용하여 내용을 비교할 수 있다. 이 연산자들은bool값을 돌려준다.==, !=, >, >=, <,그리고<=연산자를 사용할 수 있다. 우선순위 연산자는 사전식으로 ASCII 문자 배치 순서로 내용을 비교한다. 예를 들어:object == object; // true object != (object + 'x'); // true object <= (object + 'x'); // true
삽입-연산자를 사용하여string객체를ostream에 삽입할 수 있다 (3.1.4항). 추출-연산자를 사용하면 문자열 객체를istream으로부터 추출할 수 있다. 추출 연산자는 기본으로 먼저 모든 공백 문자들을 무시하고 다음에 잇따르는 모든 비-공백 문자들을istream으로부터 추출한다. 문자열 대신에 문자 배열도 추출할 수 있지만 문자열 객체를 사용하는 편이 명백하게 장점이 있다. 목표 문자열 객체는 필요한 문자의 갯수에 맞게 자동으로 크기가 조정된다. 예를 들어:cin >> object; cout << object;
std::string 클래스는 많은 멤버 함수가 있다. 추가로 제공되는 비-멤버 함수도 문자열 클래스의 일부로 간주해야 한다. 이 함수들을 모두 아래에 알파벳 순서로 나열하였다.
상징적인 string::npos 값이 문자열 클래스에 정의되어 있다. 이 값은 멤버 함수가 문자열 오프셋 위치를 돌려줄 때 `발견하지 못한 인덱스'를 나타낸다. 예를 들어 문자 'x'가 들어 있지 않은 문자열 객체에 `object.find('x')'를 호출하면 (아래 참고) npos가 반환된다. 요청한 위치가 존재하지 않기 때문이다.
C 문자열에서 NTBS의 끝을 가리키는 마지막 0-바이트는 C++ 문자열의 일부분으로 간주되지 않는다. 그래서 C 문자열의 문자들을 담고 있는 문자열 객체에서 0을 찾으면 멤버 함수는 length()가 아니라 npos를 돌려준다.
다음은 문자열 객체에 작동하는 표준 함수들이다. 매개변수로 size_t를 언급하면 string::size_type 유형의 매개변수로 이해해도 된다. 그러나 기본 인자 값이 정의되어 있지 않을 경우는 제외한다. size_type 유형은 string::size_type로 읽어야 한다. size_type라고 지정하면 5.2절에 언급된 기본 인자 값이 적용된다. 인용부호를 붙인 함수는 모두 std::string 클래스의 멤버 함수이다. 단, 따로 언급하면 예외이다.
지정된 위치의 문자에 대한 참조가 반환된다.string const객체로 호출하면char const &가 반환된다. 이 멤버 함수는 범위를 벗어났는지 점검한다. 유효하지 않은 인덱스를 건네면 예외를 일으킨다 (기본값으로 프로그램을 종료시킨다).
begin부터end까지 범위의 문자가 현재 문자열 객체에 추가된다.
argument (또는 부문자열)이 현재 문자열 객체에 추가된다.
argument에서 앞쪽an개의 문자가 문자열 객체에 추가된다.
ch문자n개가 현재 문자열 객체에 추가된다.
argument(또는 부문자열)이 문자열 객체에 할당된다.argument는 유형이char const *이고 인자가 또 하나 더 주어지면 두 번째 인자는an을 초기화할 값으로 이해된다. 0을 사용하여apos를 초기화한다.
n개의ch문자가 현재 문자열 객체에 할당된다.
문자열 객체에 저장된 마지막 char를 가리키는 참조를 돌려준다. 빈 문자열일 경우 그 결과는 정의되어 있지 않다.
현재 문자열 객체의 첫 문자를 가리키는 반복자를 돌려준다.const문자열 객체이면const_iterator가 반환된다.
현재 문자열 객체에 저장할 수 있는 문자의 갯수를 돌려준다. 크기를 다시 조정할 필요가 없다.
현재 문자열 객체의 첫 문자를 가리키는 const_iterator를 돌려준다.
현재 문자열 객체의 마지막을 가리키는 const_iterator를 돌려준다.
현재 문자열 객체에 저장된 텍스트와argument에 저장된 텍스트를 비교한다. ASCII 문자 대조 순서를 이용하여 사전 순서로 비교한다. 내용이 일치하면 0을 돌려주고 문자열 객체의 텍스트가argument의 텍스트보다 앞에 오면 음의 값이 반환된다. 뒤에 오면 양의 값이 반환된다.
현재 문자열 객체에 저장된 텍스트의 부문자열을argument에 저장된 텍스트와 비교한다.opos에서 시작해 최대on개의 문자를argument의 텍스트와 비교한다.
현재 문자열 객체에 저장된 텍스트의 부문자열을argument에 저장된 부문자열과 비교한다.opos에서 시작해 최대on개의 문자를argument의apos에서 시작해 최대an개의 문자와 비교한다. 이 경우argument는 반드시 문자열 객체이어야 한다.
현재 문자열 객체에 저장된 텍스트의 부문자열을argument에 저장된 텍스트의 부문자열과 비교한다. 현재 문자열 객체의opos에서 시작해 최대on개의 문자를argument에서 최대an개의 문자와 비교한다.argument는 적어도an개의 문자가 있어야 한다. 문자는 값에 상관이 없다. 값이 0인 문자도 특별한 의미가 없다.
현재 문자열 객체의 내용이 (부분적으로)argument안에 복사된다. 복사된 실제 갯수가 반환된다. 두 번째 인자는 복사할 문자의 갯수를 지정하기 때문에 필수이다. 사본 문자열에 값이 0인 문자를 추가하지는 않지만 다음과 같은 상용구를 이용해 추가할 수 있다.argument[object.copy(argument, string::npos)] = 0;물론, 프로그래머는 값이 0인 바이트를 추가로 수용할 만큼argument의 크기가 충분히 큰지 확인해야 한다.
현재 문자열 객체의 마지막 문자를 가리키는 const_reverse_iterator를 돌려준다.
현재 문자열 객체의 시작을 가리키는 const_reverse_iterator를 돌려준다.
현재 문자열 객체의 내용을 NTBS로 돌려준다.
현재 문자열 객체의 날 내용을 돌려준다. 이 멤버 함수는 NTBS를 돌려주지 않는다 (c_str은 NTBS를 돌려준다). 현재 문자열 객체에 저장된 정보를 종류에 상관없이 열람할 수 있다. 예를 들어 일련의 0-바이트들도 열람이 가능하다.string s(2, 0); cout << static_cast<int>(s.data()[1]) << '\n';
현재 문자열 객체에 데이터가 없으면 true가 반환된다.
현재 문자열 객체의 마지막 문자를 넘어서서 반환된 위치를 가리키는 반복자이다.const문자열 객체라면const_iterator가 반환된다.
현재 문자열 객체에 저장된 정보의 (부) 문자열이 삭제된다.
end매개변수는 선택적이다. 생략되면 현재 객체의end멤버가 돌려주는 값이 사용된다.begin반복자와end반복자로 정의된 범위의 문자들이 삭제된다.begin반복자가 반환된다. 이 반복자는 마지막으로 삭제된 문자 바로 다음의 위치를 가리킨다.
현재 문자열 객체에서 argument가 발견된 첫 번째 인덱스가 반환된다.
현재 문자열 객체에서argument가 발견된 첫 번째 인덱스가 반환된다. 이 세 인자 모두 지정되면 첫 인자는 반드시char const *가 되어야 한다.
현재 문자열 객체에서 ch가 발견된 첫 번째 인덱스를 돌려준다.
size_t find_first_of(string const &argument, size_type opos) const: 현재 문자열 객체에서 argument 안의 문자가 발견된 첫 인덱스를 돌려준다.
size_type find_first_of(char const *argument, size_type opos, size_type an) const:
현재 문자열 객체에서argument안의 문자가 발견된 첫 번째 인덱스를 돌려준다.opos를 지정하면 현재 문자열 객체에서argument검색을 시작해야 할 첫 번째 인덱스를 가리킨다. 생략하면, 문자열 객체를 전부 스캔한다.an을 제공하면char const *인자에서 검색에 사용해야 할 문자의 갯수를 가리킨다.argument부터 시작하는 부문자열을 정의한다. 생략하면argument의 문자를 모두 사용한다.
현재 문자열 객체에서 ch 문자가 발견된 첫 번째 인덱스를 반환한다.
현재 문자열 객체에서 ch 말고 다른 문자가 발견된 첫 번째 인덱스를 돌려준다.
현재 문자열 객체에서 argument 안의 문자가 발견된 마지막 인덱스를 돌려준다.
현재 문자열 객체에서argument인자의 문자가 발견된 마지막 인덱스를 돌려준다.opos가 제공되면 현재 문자열 객체에서argument의 검색을 시작할 마지막 인덱스를 가리킨다. 생략하면 문자열 객체를 전부 스캔한다.an을 제공하면char const *인자에서 검색에 사용해야 할 문자의 갯수를 가리킨다.argument의 처음부터 시작하는 부문자열을 정의한다. 생략하면argument의 문자를 모두 스캔한다.
현재 문자열 객체에서 ch 문자가 발견된 마지막 인덱스를 돌려준다.
현재 문자열 객체에서 argument 안의 문자가 나타나지 않은 마지막 인덱스를 돌려준다.
문자열 객체 안에 저장된 첫 번째 char를 가리키는 참조점을 돌려준다. 빈 문자열이라면 그 결과가 어떨지 정의되어 있지 않다.
std::string 클래스의 할당자를 돌려준다.
주의: 이 함수는string클래스의 멤버 함수가 아니다.
텍스트 한 줄을istr로부터 읽는다.delimiter를 만날 때까지 (또는 스트림의 끝이 될 때까지, 어느 쪽이든 먼저 도달할 때까지) 모든 문자를istr로부터 읽어서object에 저장한다. 구분자를 만나면 스트림으로부터 제거되지만line에 저장되지 않는다.
구분자가 발견되지 않으면istr.eof가true를 돌려준다 (6.3.1항). 스트림은bool값으로 번역이 가능하므로 (6.3.1항) 다음과 같이 스트림으로부터 모든 줄을 연속적으로line문자열 객체 안으로 읽어 들이는 상용구가 자주 사용된다.while (getline(istr, line)) process(line);마지막 줄의 내용은 최종적으로object에도 할당된다. 구분자로 끝나든 말든 상관이 없다.
argument의 (부)문자열이 현재 문자열 객체의 인덱스 위치opos에 삽입된다.apos와an에 대한 인자는 둘 다 제공하든지 아니면 둘 다 생략해야 한다.
(char const *유형의)argument가 현재 문자열 객체의 인덱스opos에 삽입된다.
count개의ch문자가 현재 문자열 객체의 인덱스opos에 삽입된다.
ch문자가 현재 객체에서begin반복자가 가리키는 위치에 삽입된다.begin반복자를 돌려준다.
count개의ch문자가 현재 문자열 객체에서begin반복자가 가리키는 위치에 삽입된다.begin반복자를 돌려준다.
abegin과aend로 정의된 입력 반복자 범위의 문자들이 현재 문자열 객체에서begin반복자가 가리키는 위치에 삽입된다.begin반복자를 돌려준다.
현재 문자열 객체에 저장된 문자의 갯수를 돌려준다.
현재 문자열 객체에 저장할 수 있는 문자의 최대 갯수를 돌려준다.
문자열 객체에서 마지막 문자가 제거된다.
ch 문자를 문자열 객체 뒤에 덧붙인다.
현재 문자열 객체의 마지막 문자를 가리키는 역방향 반복자를 돌려준다.const문자열 객체라면reverse_const_iterator가 반환된다.
현재 문자열 객체의 첫 문자 바로 앞 위치를 가리키는 역방향 반복자를 돌려준다.const문자열 객체라면reverse_const_iterator가 반환된다.
object의 (부) 문자열이argument의 문자로 교체된다.on이 0이면argument가object에서opos위치에 삽입된다.
object에서 일련의 객체들이char const *인자의 앞쪽an개의 문자로 교체된다.
현재 문자열 객체에서on개의 문자가opos인덱스 위치부터 시작하여count개의ch문자로 교체된다.
현재 문자열 객체에서begin부터end까지 반복자로 정의된 일련의 문자가argument로 교체된다.argument가char const *이면 추가 인자an이 사용된다.argument에서 교체에 사용될 문자의 갯수를 지정한다.
현재 문자열 객체에서begin부터end까지 반복자로 정의된 갯수의 문자가count개의ch문자로 교체된다.
현재 문자열 객체에서begin부터end까지 반복자로 정의된 일련의 문자가abegin과aend입력 반복자 범위에 정의된 문자로 교체된다.
현재 문자열의 가용능력이 최소한request로 바뀐다. 이 멤버 함수를 호출하면capacity의 반환 값은 적어도request이다.capacity가 돌려주는 값보다 더 작은 값을 지정하면 무시된다.max_size가 반환하는 값보다request가 더 크면std::length_error예외가 일어난다 (std::length_error는stdexcept헤더에 정의되어 있다).reserve()를 호출하면 문자열의 가용능력을 재정의하는 효과가 있다. 실제로 메모리를 더 확보하는 것은 아니다. 이 사실은 문자열의at()멤버가capacity가 아니라size를 초과하는 문자에 접근을 시도할 때 에러를 던지는 것을 보면 알 수 있다.
현재 문자열 객체의 크기가size개의 문자로 조정된다. 문자열 객체가 현재 크기보다 더 커지면 추가 문자들은ch로 초기화된다. 크기가 줄어들면 높은 자리의 문자들이 잘려 나간다.
현재 문자열 객체에서argument가 발견된 마지막 위치를 돌려준다. 검색은 현재 객체의 오프셋opos부터 역방향으로 처음까지 계속된다.
현재 문자열 객체에서argument가 발견된 마지막 인덱스를 돌려준다. 현재 객체의 오프셋opos부터 역방향으로 처음까지 검색은 계속된다.an매개변수는 찾을argument부문자열의 길이를 지정한다.argument의 처음부터 계산된다.
현재 문자열 객체에서ch가 발견된 마지막 위치를 돌려준다. 현재 객체의 오프셋opos으로부터 역방향으로 처음까지 검색이 계속된다.
벡터에 할당된 메모리의 양을 현재 크기만큼 줄인다. 선택적이기 때문에 구현자는 이 요구조건을 무시하거나 아니면 최적화해도 된다. `크기에 맞게 줄이기' 연산의 결과를 보장하기 위해 다음 상용구를 사용할 수 있다.
string(stringObject).swap(stringObject)
현재 문자열 객체 안에 저장된 문자의 갯수를 돌려준다. 이 멤버는 length()와 동의어이다.
현재 문자열 객체의 인덱스opos에서 시작하여 최대on개의 문자를 잘라 부문자열을 돌려준다.
현재 문자열 객체의 내용이argument의 내용과 교체된다. 이 멤버에 대하여argument는 반드시 문자열 객체가 되어야 하며char const *가 되면 안된다.
std::string 객체를 생성하고 처리하는 문자열 변환 함수를 아래에 알파벳 순서로 나열하였다. 클래스가 있는 멤버 함수가 아니다. std 이름 공간에 자유 함수로 선언되어 있다. <string> 헤더를 먼저 포함시켜야 사용할 수 있다.
str에서 맨 앞에 있는 공간문자는 무시한다. 다음으로 잇따르는 문자들을float값으로 변환해 돌려준다.
- 십진 부동 소수점 상수:
- 선택적으로 + 또는 - 문자
- 일련의 십진 수, 안에 소수점 문자 하나를 포함할 수 있다.
- 선택적으로 e 또는 E 문자, 다음에 선택적으로 - 또는 + 문자, 그 다음에 일련의 십진 수가 따른다.
- 십육진 부동 소수점 상수:
- 선택적인 + 또는 - 문자
- 0x 또는 0X
- 일련의 십육진 수, 안에 소수점 하나를 포함할 수 있다.
- 선택적으로 p 또는 P 문자, 다음에 선택적으로 - 또는+ 문자, 그 다음에 일련의 십육진 수가 따른다.
- 무한대 표현:
- 선택적으로 + 또는 - 문자
- 단어로
inf또는infinity(대소문자 구별 없음)- `숫자가 아닌' 표현:
- 선택적으로 + 또는 - 문자
- 단어
nan또는nan(알파벳숫자 연속열)(nan은 대소문자 구별 없음), 결과적으로NaN부동 소수점 값이 된다.pos != 0이면str에서 변환하지 못한 첫 문자의 인덱스가*pos에 반환된다.str의 문자들을float로 변환하지 못하면std::invalid_argument예외가 일어난다. 변환된 값이float값의 범위를 넘어서면std::out_of_range예외가 일어난다.
변환은stof에 기술된 바와 같이 수행되지만 이제는double유형의 값으로 변환된다.
stof에 기술된 것처럼 변환을 수행하지만long double유형의 값으로 변환된다.
str에서 앞쪽의 공간문자들은 무시된다. 다음으로base가 지정된 숫자 시스템에서 숫치 상수를 나타내는 모든 문자들을int값으로 변환해 돌려준다. 선택적으로 + 또는 - 문자가 숫자 앞에 올 수 있다. 0으로 시작하는 값은 자동으로 팔진수로 번역된다. 값이 0x 또는 0X로 시작하면 십육진수로 번역된다.base의 값은 범위가 2에서 36 사이가 되어야 한다.pos != 0이면str에서 변환하지 못한 첫 문자의 인덱스를*pos에 돌려준다.str의 문자들을int로 변환하지 못하면std::invalid_argument예외가 일어난다. 변환된 값이int값의 범위를 넘어서면std::out_of_range예외가 일어난다.다음은 그 사용법이다.
int value = stoi(string(" -123")); // 값 -123 할당 value = stoi(string(" 123"), 0, 5); // 값 38 할당
stoi에 기술된대로 변환하지만 이제는long값으로 변환한다.
stoi에 기술된대로 변환하지만 이제는long long유형의 값으로 변환한다.
stoi에 기술된대로 변환하지만 (앞에 + 또는 - 문자를 허용하지 않으며), 이제는unsigned long유형의 값으로 변환한다.
stoul에 기술된대로 변환하지만 이제는unsigned long long유형의 값으로 변환한다.
유형은 다음int, long,long long,unsigned,unsigned long,unsigned long long,float,double또는long double중 하나가 된다. 인자의 값은 텍스트 표현으로 변환하여std::string값으로 돌려준다.
to_string에 기술된 것처럼 변환하여std::wstring의 값을 돌려준다.