표준 템플릿 라이브러리
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
표준 템플릿 라이브러리(STL)는 C++ 프로그래밍 언어의 핵심 부분으로, 제네릭 프로그래밍 개념을 기반으로 하여 컨테이너, 반복자, 알고리즘, 함수 객체 등 다양한 요소들을 제공한다. 1979년 알렉산더 스테파노프가 제네릭 프로그래밍 아이디어를 구상한 이후 여러 연구와 개발 과정을 거쳐, 1994년 ANSI/ISO C++ 표준에 포함되었다. STL은 컨테이너 어댑터, 반복자, 알고리즘, 함수 객체 등을 통해 자료 구조와 알고리즘을 효율적으로 활용할 수 있도록 지원하며, 컴파일러의 구현 품질에 따라 성능이 달라질 수 있다는 비판도 존재한다.
더 읽어볼만한 페이지
- C++ 표준 라이브러리 - Iostream
`iostream`은 C++에서 입출력 작업을 수행하기 위한 표준 라이브러리로, 스트림 버퍼, 지원 클래스, 입/출력 스트림으로 구성되며, 표준 입력, 출력, 에러, 로깅 객체를 제공하고 출력 형식 제어 기능을 제공하지만 비판도 존재한다. - C++ 표준 라이브러리 - 할당자
할당자는 C++에서 메모리 할당을 관리하며, STL 컨테이너의 메모리 모델 독립성을 지원하고, 메모리 할당, 해제, 객체 생성, 파괴를 담당하는 클래스이다. - 제네릭 프로그래밍 - 다형성 (컴퓨터 과학)
다형성은 프로그래밍 언어에서 이름이 여러 자료형에 사용되거나 객체가 여러 타입으로 취급되는 능력으로, 코드 재사용성과 유연성을 높이며 임시 다형성, 매개변수 다형성, 서브타이핑 등으로 분류되고 객체 지향 프로그래밍의 중요한 특징이며 정적, 동적 다형성으로 구현된다. - 제네릭 프로그래밍 - Boost (C++ 라이브러리)
Boost는 C++ 표준화에 영향을 준 라이브러리 모음으로, 다양한 기능과 자료 구조를 제공하며 템플릿 메타 프로그래밍과 제네릭 프로그래밍 기법을 활용하여 C++ 기술 발전에 기여한다.
표준 템플릿 라이브러리 | |
---|---|
개요 | |
종류 | 소프트웨어 라이브러리 |
프로그래밍 언어 | C++ |
구성 요소 | |
주요 요소 | 컨테이너 반복자 함수 객체 알고리즘 |
2. 역사
알렉산더 스테파노프는 1979년부터 제네릭 프로그래밍에 대한 초기 아이디어를 구상하고 연구하기 시작했다. 초기에 제너럴 일렉트릭 R&D 부서의 동료들(데이비드 머서, 딥팍 카푸르)과 함께 제네릭 프로그래밍을 소프트웨어 개발의 기초로 삼는 연구를 진행했다. 당시에는 제네릭 프로그래밍을 지원하는 프로그래밍 언어가 없었지만, Ada가 제네릭 유닛 기능을 통해 최초로 이를 지원하게 되었다.[15]
템플릿을 기반으로 하는 C++ 표준 템플릿 라이브러리(STL)는 컨테이너, 반복자, 알고리즘, 함수 객체 등 4가지 주요 구성 요소를 제공한다.
1987년까지 스테파노프와 머서는 제네릭 프로그래밍 연구 성과로 Ada의 리스트 처리 라이브러리를 개발하여 출시했다. 그러나 Ada는 군수 산업 외에는 널리 보급되지 않았고, C++가 더 널리 보급되어 제네릭 프로그래밍을 지원할 가능성이 높다고 판단되었다. 스테파노프는 포인터를 사용하여 효율성을 유지하면서 메모리에 유연하게 접근할 수 있는 C/C++의 계산 모델을 보급의 결정적인 요소로 여겼다.[15]
이후 AT&T벨 연구소와 휴렛 팩커드(HP) 연구소에서 C 언어(나중에는 C++)로 수많은 아키텍처와 알고리즘 구현 방법을 검증했다. 1992년에는 멩 리(Meng Lee)가 HP의 스테파노프 프로젝트에 합류하여 주요 기여자가 되었다.[15]
1993년 11월, 벨 연구소의 앤드루 코에닉(Andrew Koenig)의 제안으로 스테파노프는 ANSI/ISO C++ 표준화 위원회에 아이디어를 제출했다. 위원회는 이를 전면적으로 찬성했고, 1994년 3월 회의에서 코에닉의 공식 요청으로 이어졌다. 위원회는 몇 가지 변경 및 확장을 요구했고, 특히 컨테이너에 대한 확장은 데이비드 머서가 구현을 맡았다. 1994년 7월 ANSI/ISO 위원회에서 최종 승인을 받았다.[15]
이후 스테파노프와 리의 문서 17은 ANSI/ISO C++ 표준 초안판에 포함되었으며, string과 같은 다른 C++ 표준 라이브러리 기능에도 영향을 미쳤다.[15]
STL의 조기 보급은 1994년 봄 휴렛 팩커드가 구현을 인터넷에 공개하면서 크게 개선되었다. 스테파노프, 리, 머서가 개발한 이 구현은 현재 컴파일러 및 라이브러리 제조업체가 출시하는 많은 구현의 기초가 되었다.[15]
3. 구성 요소
STL은 템플릿을 사용하여 제네릭 프로그래밍을 지원하며, 컨테이너와 알고리즘이 서로 독립적으로 동작한다. 각 구성 요소는 '컨셉'이라는 요구 사항을 만족해야 하며, 이를 통해 사용자가 직접 만든 클래스나 함수도 STL 구성 요소와 함께 사용할 수 있다. 이는 덕 타이핑과 유사하지만, STL은 정적 타입 시스템을 사용한다.
STL의 정의는 다양하게 해석될 수 있지만, 일반적으로 C++ 표준 라이브러리의 컨테이너, 반복자, 알고리즘, 함수 객체를 포함한다.
3. 1. 컨테이너
hash_multiset
hash_map
hash_multimap각각 set, multiset, map 또는 multimap과 유사하지만 해시 테이블을 사용하여 구현된다. 키는 정렬되지 않지만 키 유형에 대한 해시 함수가 존재해야 한다. 이러한 유형은 C++ 표준에서 제외되었다. 유사한 컨테이너는 C++11에서 표준화되었지만 다른 이름 (`unordered_set` 및 `unordered_map`)으로 제공되었다. 기타 유형의 컨테이너 bitset 고정 크기 bool 벡터와 유사한 일련의 비트를 저장한다. 비트 연산을 구현하고 반복기가 없다. 시퀀스가 아니다. 임의 접근을 제공한다. valarray 다른 배열 데이터 유형이며, 숫자 사용 (특히 벡터 및 행렬)을 위해 사용된다. C++ 표준은 이러한 의도된 목적에 대한 특정 최적화를 허용한다.