"STL"과 "C ++ 표준 라이브러리"의 차이점은 무엇입니까?


446

누군가가 SGI STL에서 가져온 부분 대신 전체 C ++ 표준 라이브러리를 언급하는 데 STL 용어가 잘못 사용 되었다고 주장 하면서이 기사 를 주목했습니다 .

(...) STL (SGI에서 설계된)을 사용하는 사람이 거의 없다는 사실에도 불구하고 "STL"을 나타냅니다.

C ++ 표준 라이브러리의 일부는 STL의 일부를 기반으로했으며 많은 사람들 (여러 작성자 및 악명 높은 오류가 발생한 cplusplus.com 포함)이 여전히 "STL"이라고 언급하는 부분입니다. 그러나 이것은 정확하지 않습니다. 실제로 C ++ 표준은 "STL"을 언급하지 않으며, 둘 사이에 내용 차이가 있습니다.

(...) "STL"은 SGI STL을 기반으로하는 stdlib의 비트를 나타내는 데 거의 사용되지 않습니다. 사람들은 그것이 전체 표준 라이브러리라고 생각합니다. 이력서에 올라갑니다. 그리고 오해의 소지가 있습니다.

나는 C ++의 역사에 대해 거의 알지 못하므로 기사의 정확성을 판단 할 수 없습니다. STL이라는 용어를 사용하지 않아야합니까? 아니면 이것은 고립 된 의견입니까?


62
사람들은 물건을 묘사하기 위해 좋은 이름이 필요합니다. Stepanov의 천재는 우리가 프로그램하는 방식을 바 꾸었습니다. "표준 라이브러리 프로그래밍"과 같은 이름은 그것을 설명하는 데 전혀 쓸모가 없습니다. 그것을 "stl programming"이라고 부르면 모두 가 무슨 뜻인지 알 것입니다. 그것에 대해 논쟁하는 것은 요점을 놓칩니다. 우리는 좋은 이름이 필요합니다.
Hans Passant

34
@Hans : 아니요, 요점 놓 칩니다. " 모든 사람 이 무슨 뜻인지 알고 있습니다"는 사실아닙니다 .
궤도

16
무슨 말인지 모르겠어요
Hans Passant

21
다음 은 "STL"을 사용하여 전체 C ++ 표준 라이브러리를 참조하는 사람의 완벽한 예입니다. 거의 매일 매일 보는 것이 평범 할 때 많은 사람들이 맹인을 맹세하지 않는다고 계속해서 당황하게합니다.
궤도에서 가벼움 레이스

답변:


571

"STL" C ++이 표준화되기 오래 전부터 Alexander Stepanov가 작성했습니다 . C ++은 80 년대에 존재했지만 이제 " C ++ "라고하는 것은 ISO / IEC 14882 : 2014 (및 ISO / IEC 14882 : 2011과 같은 이전 버전)에서 표준화 된 언어입니다.

STL은 이미 C ++ 용 라이브러리로 널리 사용되어 프로그래머에게 컨테이너, 반복자 및 알고리즘에 대한 액세스 권한을 부여했습니다. 표준화가 일어 났을 때, 언어위원회는 설계 의 부품 수 (언어 표준의 일부 임) C ++ 표준 라이브러리 매우 밀접하게 STL과 일치합니다.

수년 동안 저명한 저술가와 다양한 웹 사이트를 포함하여 많은 사람들이 C ++ 표준 라이브러리를 "STL"이라고 계속 언급했지만 두 개체가 분리되어 있고 약간의 차이점이 있습니다. 이러한 차이점은 다가오는 새로운 C ++ 표준에서 더욱 두드러지며 다양한 기능을 포함하고 일부 클래스를 크게 변경합니다.

원래 STL은 Microsoft Visual Studio 또는 GCC가 C ++ 표준 라이브러리의 구현을 제공하는 것과 같은 방식으로 종종 "C ++ 표준 템플릿 라이브러리의 구현"(실제 기록으로 거꾸로!)이라고합니다. 그러나 "표준 템플릿 라이브러리"와 "표준 라이브러리"는 같은 것이 아닙니다.

현재 표준 라이브러리를 "STL"로 전체 또는 일부로 호출해야하는지, 그리고 그것이 무엇을 호출하는지에 대한 문제가 있습니다.

"STL"의 경우

모든 사람들이 이제 "C ++"가 ISO 표준 언어라는 것을 알고있는 것처럼 "STL"이 표준 라이브러리를 의미한다는 것을 모든 사람들이 알고 있다고 생각하는 학교가 있습니다.

또한 모든 당사자가 대화 내용을 이해하는 한 실제로 중요하지 않다고 믿는 사람들도 포함합니다 .

이 용어는 짐승의 본질에 의해 더욱 널리 사용되는 용어로, 대부분 "템플릿"으로 알려진 C ++ 기능을 많이 사용합니다.

"C ++ 표준 라이브러리"(또는 stdlib)

그러나 내가 구독하는 다른 생각의 학교가 있는데 이것이 혼란 스럽습니다. 처음으로 C ++를 배우는 사람들은 하지 않는 이 차이를 알고, 작은 언어의 차이를 알 수 없습니다.

이 기사의 저자는 전체 C ++ 표준 라이브러리 는 STL 자체에 포함되지 않은 기능을 포함 STL . 대조적으로, "STL"의 대부분의 음성 지지자들은 그것이 의미하는 바를 정확히 알고 있으며 모든 사람이 그것을 얻지는 않는다고 믿지 않습니다. 분명히이 용어의 사용법은 일정하지 않습니다.

또한 C ++ 표준 라이브러리가 아닌 원래 STL을 구현 한 일부 STL 유사 라이브러리가 있습니다. 최근까지 STLPort 는 그 중 하나였습니다 (그리고 거기에서도 혼란이 가득합니다!).

또한 C ++ 표준에는 "STL"이라는 텍스트가 포함되어 있지 않으며 일부 사람들은 "STL이 C ++ 표준 라이브러리에 포함되어 있습니다 "와 같은 문구를 습관적으로 사용합니다 .

이런 식으로 용어의 사용을 계속 전파하면 오해가 영원히 계속 될 것입니다. 아아, 그것은 더 나은 것으로 생각 되더라도 물건을 바꾸려고 시도하는 것이 완전히 역효과를 낳을 수 있습니다. 우리는 이중 의미를 영원히 붙잡을 수 있습니다.

결론

이 게시물이 약간 편향되어 있음을 이해합니다. 링크 된 기사를 작성했습니다. :) 어쨌든, 이것이 전투를 조금 더 잘 설명하는 데 도움이되기를 바랍니다.

2011 년 4 월 13 일 업데이트

다음은 세 가지 완벽한 예제 전체 C ++ 표준 라이브러리를 참조하는 "는 STL"을 사용하는 사람의이. 거의 매일 매일 보는 것이 평범 할 때 많은 사람들이 맹인을 맹세하지 않는다고 계속해서 당황하게합니다.


136
S tandard T emplate L의 ibrary 만에 의해 작성되지 않은 세인트 epanov와 L의 EE, 그러나 그들은 또한에서 작업 중이던 S oftware T 기 술의 L의 시간에 aboratory.
Kragen Javier Sitaker

21
오늘 누군가 헤더 std::iota가 무엇인지 묻고 있었기 때문에 작동하지 못했습니다. SGI 비표준 확장입니다 . "STL"이기 때문에 "STL"이 C ++ 표준 라이브러리의 일부라는 것을 알고있을 때 "표준"이라고 부릅니다. 그리고 C ++ 0x에서 소개되었지만 C ++ 03에서는 사용할 수 없습니다. Grrr.
궤도에서 가벼움 레이스

40
그리고 MS STL은 S tephan T에 의해 유지됩니다 . L avavej, 일명 STL.
미하엘 라


26
Bjarne Stroustrup은 "캐논"(C ++ Programming Language 4th Edition)에서 표준 라이브러리의 다른 부분과 STL을 차별화합니다.
codenheim

84

실제로 올바른 답은 없습니다. Alexander Stepanov는 STL (당시 HP에서 일함)이라는 라이브러리를 개발했습니다. 그런 다음이 라이브러리는 C ++ 표준에 포함되도록 제안되었습니다.

그것은 기본적으로 "포크 된"개발입니다. 위원회는 일부를 포함하고 일부를 완전히 거부했으며 (알렉산더의 참여로) 일부를 재 설계했다. 원래 라이브러리의 개발은 나중에 Silicon Graphics로 옮겨졌지만 C ++ 표준 라이브러리와 별도로 계속되었습니다.

그 조각이 표준 라이브러리에 추가 된 후, 표준 라이브러리의 일부 다른 부분이 더 추가 된 것과 맞게 수정 된 (예를 들어, begin, end, rbeginrend에 추가 된 std::string이 컨테이너처럼 사용할 수 있도록). 같은 무렵, 대부분의 의 라이브러리 ( 완전히 관련되지 않은 조각조차 )는 다른 유형 (예 : 표준 스트림)을 수용하기 위해 템플릿으로 만들어졌습니다.

일부 사람들은 STL을 "표준 라이브러리"의 짧은 형식으로도 사용합니다.

이는 누군가 "STL"이라는 용어를 사용할 때 약 6 가지의 다른 것들을 언급 할 수 있다는 것을 의미합니다. 더 좋든 나쁘 든, 그것을 사용하는 대부분의 사람들은 여러 가지 의미를 무시하고 다른 사람들이 자신이 말하는 것을 인식 할 것이라고 가정합니다. 이로 인해 많은 오해가 생겨 났으며, 참가자들 대부분이 완전히 다른 것에 대해 이야기했기 때문에 어리석게 보이게하는 몇 가지 심각한 화염 전쟁이 발생했습니다.

불행히도 혼란은 계속 완화 될 것입니다. "C ++ 표준 라이브러리의 컨테이너, 반복자 및 알고리즘이지만 std::string"컨테이너처럼 작동 할 수는 있지만 포함하지 않는 "컨테이너보다"STL "을 참조하는 것이 훨씬 편리합니다 . "C ++ 표준 라이브러리"가 그렇게 길고 서투른 것은 아니지만 "STL"은 여전히 ​​훨씬 짧고 단순합니다. 까지 또는 (필요한 경우) 더 정확한이다 누군가 발명 한 용어를 제외 하고 단지 편리으로, "STL은"계속 사용됩니다 및 혼란이 야기 할 것입니다.


5
@ 제리 : 전자; 그것이 "std"의 약자입니다. :)
궤도에서 가벼운 경주

6
@ Jerry : 네임 스페이스가 어디로 들어오는 지 확실하지 않습니다. 호환 구현은 네임 스페이스에 아무 것도 추가하지 않습니다 std. 나는 "표준"을 의미하는 "stdlib"에서 "std"에 대해 이야기하고있었습니다. 나는 그것이 무엇을 의미하는지 분명하다고 생각합니다!
궤도

3
@Jerry : 난 누군가가 형용사 "표준"을 "이것은 표준에 있습니다"라고 읽는 것을 기대하기가 쉽지 않다고 생각합니다. 한편, 17.4.3.1/1은 네임 스페이스에 사물을 추가하는 것이 stdUB라는 특별한 경우를 제외하고는 UB라는 것이 매우 분명 합니다. "표준"이 여전히 적용됩니다.
궤도에서 가벼운 경주

1
SGI와 HP의 역사는 거꾸로 있습니다. 스테파노 프는 SGI에 가기 전에 HP에있었습니다.
Kragen Javier Sitaker

2
난 그냥 여기에 의견을 다시 읽고 또 하나의 가치를 추가 할 가치가 있다고 생각했습니다. 특히, 많은 C ++ 프로그래머가 오래 전에 문구 "표준 라이브러리"사용 했다 표준을. C 표준에서 라이브러리를 참조한다고 생각하지 않는 한, C 표준이 있기 전에 C 프로그래머도 마찬가지라고 지적 할 것입니다.
Jerry Coffin

52

"STL"또는 "표준 템플릿 라이브러리"라는 용어는 ISO 14882 C ++ 표준의 어느 곳에도 나타나지 않습니다. 따라서 STL로 C ++ 표준 라이브러리를 참조하는 것은 잘못되었습니다. "C ++ 표준 라이브러리"또는 "표준 라이브러리"라는 용어는 ISO 14882에서 공식적으로 사용되는 것입니다.

ISO 14882 C ++ 표준 :

17-라이브러리 소개 [lib.library] :

  1. 이 절은 C ++ 표준 라이브러리 의 내용 , 잘 구성된 C ++ 프로그램이 라이브러리를 사용하는 방법 및 준수 구현이 라이브러리의 엔티티를 제공하는 방법을 설명합니다.

...

STL은 원래 C ++ 표준과 무관하게 Alexander Stepanov가 설계 한 라이브러리입니다. 그러나, C ++ 표준 라이브러리의 일부 구성 요소는 STL의 같은 구성 요소를 포함 vector, list와 같은 알고리즘 copyswap .

물론 C ++ 표준에는 STL 외부에 훨씬 더 많은 것이 포함되어 있으므로 "C ++ 표준 라이브러리"라는 용어가 더 정확합니다 (표준 문서에서 실제로 사용되는 것임).


5
+1. STL에는 std네임 스페이스 (IIRC) 가 없었습니다 .
궤도

1
당시 대부분의 C ++ 컴파일러는 네임 스페이스를 구현하지 않았습니다. 사실, 나는 그들이 표준에 있는지조차 모른다.
Kragen Javier Sitaker

3
@Kragen : 글쎄요, 표준은 없었습니다.
궤도에서 가벼움 레이스

3
오. 글쎄, Stroustrup의 책이 몇 개 있지만 그게 똑같은 것은 아니라고 생각합니까?
Kragen Javier Sitaker

23

최근에 같은 주장을했지만 약간의 관용이 허용 될 수 있다고 생각합니다. 경우 스콧 마이어스는 같은 실수를, 당신은 좋은 회사에있어.


@Tomalak & @Mark : 실제로 Scott은 -1나에게서 하지 않습니다 . 이 책은 실제로 "Stepanov의 도서관에서 유래 한 표준 라이브러리의 일부"라는 의미에서 STL에 관한 것입니다. TOC 책을 살펴 보는 시간을 가지십시오. 원래 STL 외부에서 찾을 수있는 유일한 것은 std::string이며, 본격적인 STL 컨테이너가 장착되었습니다.
sbi

@ sbi : 당신은 분명히 내 위치를 잘못 해석했습니다. Scott이하는 방식으로 "STL"을 사용하지 않겠습니다. 내 대답을 읽으십시오.
궤도에서 가벼운 경주

6
@Tomalak, 나는 과거에 유죄였던 것처럼 "STL"도 그런 식으로 사용하지 않을 것입니다. 난 그냥 사람들을 치는 것이 가치가 있다고 생각하지 않습니다.
Mark Ransom

1
내가 존중할 수있다. 나는 잠재적 인 모호성을 인정하지 않는 사람들에 대해 가장 비판을 받는다. :)
궤도에서 가벼움 경주

11
당신은 또한 Bjarne Stroustrup의 회사에 속합니다-심판. 예. stroustrup.com/DnE2005.pdf : "STL ("표준 템플릿 라이브러리 ", 즉 ISO C ++ 표준 라이브러리의 컨테이너 및 알고리즘 프레임 워크)"
Sander De Dycker

7

로부터 GNU 표준 C ++ 라이브러리 (libstdc ++) 자주 묻는 질문 :


STL (Standard Template Library)은 C ++ 표준 라이브러리의 많은 부분에 영감을 주었지만 용어는 서로 바꾸어 사용할 수 없으며 같은 의미가 아닙니다. C ++ 표준 라이브러리에는 STL에서 제공되지 않은 많은 것들이 포함되어 있으며 일부는 std::locale및과 같은 템플릿조차 아닙니다 std::thread.

Libstdc ++-v3는 SGI STL 의 많은 코드를 통합합니다 (최종 병합은 릴리스 3.3 에서 이루어졌습니다) ). libstdc ++의 코드에는 원래 SGI 코드와 비교하여 많은 수정 및 변경 사항이 포함되어 있습니다.

특히 stringSGI 출신이 아니며 "로프"클래스를 사용하지 않습니다 (선택적 확장으로 포함되어 있음에도 불구하고) valarray. 같은 수업vector<> 은 SGI 출신이지만 광범위하게 수정되었습니다.

libstdc ++의 진화에 대한 자세한 정보는 API 진화이전 버전과의 호환성 에서 찾을 수 있습니다. 설명서를 참조하십시오.

자주 묻는 질문 SGI의 STL에 대한 여전히 읽기를 권장합니다.


참고로 2018 년 3 월 현재 공식 STL 웹 사이트 www.sgi.com/tech/stl/도 사라졌습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.