2011-09-17 3 views
3

Click here 기능을 확인하십시오. 보시다시피, 마지막 세 개를 제외하고는 모두 문자열에 대한 참조를 반환합니다. 3 번째 마지막 오버로딩은 iterator를 반환하는데, 나는 iterator가 insert 연산 후에 무효화 될 수 있기 때문에 추측하고있다.string :: insert의 다른 반환 유형 뒤에있는 이유는 무엇입니까?

마지막 두 기능은 무엇입니까? 그들은 문자열에 대한 참조를 반환하지 않는 이유는 무엇입니까? 이것 뒤에 어떤 이유가 있습니까?

답변

8

내역입니다. std::string은 C++에 존재해서는 안되는 것입니다. 왜냐하면 C++에는 문자열 클래스가 없어야했기 때문에 (std::string이 작업 중일 때 수만 개가 있었음에 틀림 없지만) C++ 표준화가 기존 연습을 코드화하기위한 것이기 때문에 그 문자열 클래스는 하나도 없었습니다. 표준화 된 문자열 클래스를 갖기 위해 단지 std::string으로 이름을 바꿀 필요가있었습니다. 그래서 그것은 "위원회에 의한 디자인"이었습니다. Stroustrup이 무서워서 C++ 표준화 노력이 피하려고했습니다.
그럼에도 불구하고 도서관 워킹 그룹은 자신이 좋아하는 문자열 클래스를 찾지 못해서 표준화 과정의 주요 기본 원칙 중 하나를 위반하여 자체적으로 문자열 클래스를 만들었습니다. 그 충분하지 것처럼

그리고

만 달 C++의 예상 표준화하기 전에, 스트로브 스트 룹은 Stepanov에 달려 자신의 STL. 컨테이너와 알고리즘의 라이브러리가 당황스럽게 C++ 표준에서 빠져있었습니다. Stroustrup이 Stepanov에 관심이있는 것 같습니다. 우리 모두에게 이상한 보면서 STL은, 누가 지금까지 만을 결합 의 독특한 장점을 가지고 고전 OO 라이브러리에 노출되었던 특정 (경우 외국인) 효율성, 뭔가 우아함 우리 모두 그 시점에서, 전혀 결합 할 수없는 것으로 생각했다.
그래서 Stroustrup은 표준에 STL을 포함시키기 위해 로비 활동을 벌였으며 궁극적으로는 1 년 동안 표준을 지연 시켰습니다. (그리고이 지연 오늘날 우리가 감사하지 않습니다! 내 말은, C는 STL!없이 무엇을 할 수 ++ 것) 과정에서
,이 std::string도 컨테이너 것을 깨달았다, 그래서 소급이었다 에 의해 본격적인 STL 컨테이너로 바뀌 었습니다. 이미 상당히 팽창 된 인터페이스에 STL 컨테이너 인터페이스을 추가했습니다.

그래서 std::string에는 반복자를 가져오고 반환하는 색인 ​​외에도 색인을 가져오고 반환하는 기능이 있습니다.

0

문자열의 비 대한 인터페이스와 관련이 있습니다. 마지막 두 함수 오버로드는 표준 STL 컨테이너의 오버로드입니다. 다른 것들은 STL 컨테이너를 채택하기 이전의 시간에서부터 시작되었습니다. STL 컨테이너의 문자열은 다른 (부 풀린) 인터페이스를 가지고있었습니다.

+1

"마지막 두 개"는 "마지막 세 개"여야합니다. –

1

std::vectorstd::list과 같은 다른 컨테이너의 삽입 동작을 모방하기 때문일 수 있습니다.

4

참조하는 오버로드는 다른 모든 표준 컨테이너에 대한 조작과 일치합니다. 원한다면 string을 불투명 컨테이너 char으로 처리 할 수 ​​있습니다. 따라서 insert()을 사용하는 일반 알고리즘을 사용하는 경우 코드를 변경하지 않고 string과 함께 사용할 수 있습니다.

풍부한 기능의 인터페이스를 최소한의 놀라움으로 제공하는 것은 품질 라이브러리의 특징입니다.

0

반복기를 반환하는 유일한 자연 포인트는 삽입 지점입니다. 이제 여러 문자를 추가하면 연속적으로 추가되고 이전 반복기는 모든 삽입 작업에 대해 무효화됩니다. 즉, 문자열에 실제로 모든 문자를 추가 한 경우 더 이상 삽입 지점에 대한 유효한 반복자가 없습니다.

관련 문제