프로그래밍 공부
작성일
2023. 5. 28. 04:25
작성자
WDmil
728x90

STL

 

STL 은 C++ 프로그래밍 언어의 표준 라이브러리인 "Standard Template Lirary"의 약자이다.

 

STL은 제네릭 프로그래밍 개념을 기반으로 하여, 유용한 컨테이너 클래스, 알고리즘 함수 및 객체를 재공하여  C++개발자 들이 보다 쉽고 효율적으로 작업할 수 있도록 해준다.

 


STL은 주 네가지 구성요소로 이루어져있다.

  1. 컨테이너 (Containers)
  2. 알고리즘 (Iterators)
  3. 함수객체 (Algorithms)
  4. 반복자 (Function Objects)

컨테이너 (Containers)

STL의 컨테이너는 데이터를 저장하는 클래스를 말한다.

 

다양한 형태의 컨테이너를 제공한다.

이러한 컨테이너 들은 다양한 데이터 구조와 동적 메모리 할당 등을 추상화하여, 제공함으로.

데이터의 삽입, 삭제, 검색 등을 편리하게 수행할 수 있다.


알고리즘 (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의 컨테이너에 저장된 요소들을 순회하고 접근하기 위한 인터페이스 를 말한다.

 

컨테이너의 내부구조에 대한 세부정보를 알 필요 없이 접근할 수 있도록 해주기에 다음과 같은 작업을 수행한다.

 

  1. 컨테이너 요소의 탐색
    • 컨테이너 요소를 순회하며 접근한다.
  2. 알고리즘과 결합
    • 반복자는 알고리즘 함수와 결합되어 사용된다. 알고리즘 함수는 반복자를 통해 컨테이너에 접근하게 된다.

이러한 반복자는 5종류가 있으며 다음과 같다.

  1. 입력 반복자 (Input Iterator)
    • 컨테이너 요소를 순차적으로 접근하여 읽을 수 있는 기본적인 반복자이다.
    • 한번에 한 요소씩 순차적으로 읽을 수 있으며, 읽기전용 연산만 지원한다.
    • 예시 : std::istream_iterator
  2. 출력 반복자 (Ouput Iterator)
    • 컨테이너 요소에 순차적으로 값을 쓸 수 있는 반복자 이다.
    • 한번에 한 요소씩 순차적으로 쓸 수 있으며, 쓰기전용 연산만 지원한다.
    • 예시 : std;:ostream_iterator
  3. 순방향 반복자 (Forward Iterator)
    1. 입력 및 출력 작업을 모두 지원하는 반복자이다.
    2. 컨테이너를 한번만 순회할 수 있으며, 이전 요소로 되돌아 갈 수 없다.
    3. 예시 : std::begin(), std::end()
  4. 양방향 반복자 (Bidrectional Iterator)
    1. 순방향 반복자의 모든 기능을 포함하여, 뒤로도 이동할 수 있는 반복자 이다.
    2. 컨테이너를 모두 순회할 수 있으며, 역순으로 순회또한 가능하다.
    3. 예시 : list, set, multiset, map, multimap 등의 양방향 순회가 가능한 컨테이너의 반복자.
  5. 임의 접근 반복자 (Random Access Iterator)
    1. 위의 모든 연산을 지원하는 반복자 이다.
    2. 임의의 위치에 이동하고, 임의의 요소에대한 접근, 요소간의 상대거리계산 등이 가능하다.
    3. 예시 : 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

와 같다.


 

728x90