STL
STL 은 C++ 프로그래밍 언어의 표준 라이브러리인 "Standard Template Lirary"의 약자이다.
STL은 제네릭 프로그래밍 개념을 기반으로 하여, 유용한 컨테이너 클래스, 알고리즘 함수 및 객체를 재공하여 C++개발자 들이 보다 쉽고 효율적으로 작업할 수 있도록 해준다.
STL은 주 네가지 구성요소로 이루어져있다.
- 컨테이너 (Containers)
- 알고리즘 (Iterators)
- 함수객체 (Algorithms)
- 반복자 (Function Objects)
컨테이너 (Containers)
STL의 컨테이너는 데이터를 저장하는 클래스를 말한다.
다양한 형태의 컨테이너를 제공한다.
- SequnceContatiner 선형 컨테이너
- AssociativeContainer 연관 컨테이너
- AdapterContainer 어댑터 컨테이너
이러한 컨테이너 들은 다양한 데이터 구조와 동적 메모리 할당 등을 추상화하여, 제공함으로.
데이터의 삽입, 삭제, 검색 등을 편리하게 수행할 수 있다.
알고리즘 (Algorithms)
STL의 다양한 알고리즘 함수를 제공한다.
다양한 형태의 알고리즘을 제공한다.
- sort, find, transform, accumulate 등
이러한 알고리즘 함수는, 컨테이너에 대해 정렬, 검색, 변형 등의 작업을 수행하는데 큰 도움을 제공함으로써 사용자는 임의적으로 코드를 생성하여 탐색하지 않아도 된다.
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <random>
using namespace std;
random_device rd;
mt19937_64 mt(rd());
int main()
{
vector<int> container;
for (int i = 0; i < 10; i++)
container.push_back(i);
shuffle(container.begin(), container.end(), mt);
for (auto iter = container.begin(); iter != container.end(); iter++) // 전부 섞기
cout << *iter << " ";
cout << endl;
auto iter = min_element(container.begin(), container.end()); // 최솟값 출력
cout << *iter << endl;
iter = max_element(container.begin(), container.end()); // 최대값 출력
cout << *iter << endl;
iter = find(container.begin(), container.end(), 7); // 원하는 위치의 값 출력
cout << *iter << endl;
sort(container.begin(), container.end()); // 최소값 정렬. 퀵정렬 해주는 알고리즘이다. 퀵정렬 알아보기 찾아보기 정리하기.
for (auto iter = container.begin(); iter != container.end(); iter++)
cout << *iter << " ";
cout << endl;
return 0;
}
위와같은 알고리즘이 있으며, 다른 알고리즘 또한 더 많다.
함수 객체(Function Objects)
STL에서 사용되는 함수의 동작 캡슐화 를 제공한다.
함수 자체의 캡슐화를 이야기 한다.
이러한 함수 객체는 일반 함수 나 함수 포인터 대신에 사용되며, 특정 동작을 커스터마이징 하여 더 다양한 동작을 수행하도록 하는데 사용된다.
반복자 (Iterator)
STL의 컨테이너에 저장된 요소들을 순회하고 접근하기 위한 인터페이스 를 말한다.
컨테이너의 내부구조에 대한 세부정보를 알 필요 없이 접근할 수 있도록 해주기에 다음과 같은 작업을 수행한다.
- 컨테이너 요소의 탐색
- 컨테이너 요소를 순회하며 접근한다.
- 알고리즘과 결합
- 반복자는 알고리즘 함수와 결합되어 사용된다. 알고리즘 함수는 반복자를 통해 컨테이너에 접근하게 된다.
이러한 반복자는 5종류가 있으며 다음과 같다.
- 입력 반복자 (Input Iterator)
- 컨테이너 요소를 순차적으로 접근하여 읽을 수 있는 기본적인 반복자이다.
- 한번에 한 요소씩 순차적으로 읽을 수 있으며, 읽기전용 연산만 지원한다.
- 예시 : std::istream_iterator
- 출력 반복자 (Ouput Iterator)
- 컨테이너 요소에 순차적으로 값을 쓸 수 있는 반복자 이다.
- 한번에 한 요소씩 순차적으로 쓸 수 있으며, 쓰기전용 연산만 지원한다.
- 예시 : std;:ostream_iterator
- 순방향 반복자 (Forward Iterator)
- 입력 및 출력 작업을 모두 지원하는 반복자이다.
- 컨테이너를 한번만 순회할 수 있으며, 이전 요소로 되돌아 갈 수 없다.
- 예시 : std::begin(), std::end()
- 양방향 반복자 (Bidrectional Iterator)
- 순방향 반복자의 모든 기능을 포함하여, 뒤로도 이동할 수 있는 반복자 이다.
- 컨테이너를 모두 순회할 수 있으며, 역순으로 순회또한 가능하다.
- 예시 : list, set, multiset, map, multimap 등의 양방향 순회가 가능한 컨테이너의 반복자.
- 임의 접근 반복자 (Random Access Iterator)
- 위의 모든 연산을 지원하는 반복자 이다.
- 임의의 위치에 이동하고, 임의의 요소에대한 접근, 요소간의 상대거리계산 등이 가능하다.
- 예시 : vector, deque등, +,-,+=, =, [] 의 연산이 가능한 반복자를 리턴하는 컨테이너
#include <iostream>
#include <vector>
#include <list>
#include <set>
#include <map>
using namespace std;
/*
컨테이너에 접속하여 출력할 수 있는방법들.
*/
int main()
{
{
vector<int> container;
for (int i = 0; i < 10; i++)
container.push_back(i);
vector<int>::iterator iter;
iter = container.begin(); // 첫번째 값을 반환 iter에
while (iter != container.end())
{
cout << *iter << " ";
++iter;
}
cout << endl;
for (vector<int>::iterator iter = container.begin(); iter != container.end(); iter++)
cout << *iter << " ";
for (auto iter = container.begin(); iter != container.end(); iter++)
cout << *iter << " ";
cout << endl << endl;
// 위 for문 두개는 auto 이냐 아니면 iterator 이냐에 따라 달라지는것이지 코드 자체는 같다고 봐도된다.
}
{
list<int> container;
for (int i = 0; i < 10; i++)
container.push_back(i);
for (auto iter = container.begin(); iter != container.end(); iter++)
cout << *iter << " ";
cout << endl << endl;
}
{
set<int> container;
for (int i = 0; i < 10; i++)
container.insert(i);
for (auto iter = container.begin(); iter != container.end(); iter++)
cout << *iter << " ";
cout << endl << endl;
}
{
map<int, char> container;
for (int i = 0; i < 10; i++)
container.insert(make_pair(i, i + 32));
for (auto iter = container.begin(); iter != container.end(); iter++)
cout << iter->first << ":" << iter->second << " ";
cout << endl << endl;
int answer;
for (auto iter = container.begin(); iter != container.end(); iter++)
{
cin >> answer;
if (container.find(answer) != container.end())
cout << container.find(answer)->first << " " << container.find(answer)->second;
else
break;
}
}
return 0;
}
위 코드와 같이 iterator는 접속자 역활을 하며
std::vector<int>::iterator iter
auto iter
와 같다.