C++: STL
●왜 STL을 사용해야 할까?
STL(Standard Template Library)에는 자주 사용하는 유용한 클래스와 함수들이 들어있는 템플릿을 사용해서 만들어진 라이브러리입니다. 이 안에는 링크드 리스트 클래스, 동적 배열 클래스, 정렬 함수, 검색 함수 등과 같이 범용적인 클래스와 함수들이 있습니다.
1) 확장이 용이하다.
STL의 클래스와 함수는 템플릿으로 만들어져 있기 때문에 코드를 간단하게 할 수 있습니다.
2) STL은 표준이다.
STL은 표준이기 때문에 지구에 있는 모든 프로그래머들이 작성해놓은 코드를 쉽게 알아볼 수 있습니다.
3) STL은 직접 만든 것보다 효율적이고 안전하다.
STL은 전문가들이 만들어 놓은 것이기 때문에 효율적이고 안전합니다.
●STL 컨테이너
컨테이너란 다수의 정보를 담는 역할을 하는 클래스를 말합니다. 링크드 리스트, 동적 배열, 큐, 맵 등의 클래스들을 컨테이너라고 부릅니다.
ex) list 클래스
#include <list>
#include <iostream>
int main()
{
std::list<int> intList;
for (int i = 0; i < 10; i++)
intList.push_back(i);
intList.remove(5);
std::list<int>::iterator it;
for (it = intList.begin(); it != intList.end(); it++)
std::cout << *it << std::endl;
return 0;
}
링크드 리스트와 같기 때문에 알기 매우 쉽습니다.
std::list<int> : std 네임스페이스 안 list 템플릿 클래스 객체를 선언하여서 int형을 담을 수 있는 리스트를 만듭니다.
push_back(data) : 리스트 맨 끝에 내용을 추가합니다.
remove(data) : 데이터를 보관하고 있는 노드를 찾아서 제거합니다.
std::list<int>::iterator : std 네임스페이스 안 list 템플릿 클래스 안 iterator 클래스 객체를 선언하여서 노드의 위치를 가리키게 합니다.
begin(), end() : 시작과 끝을 반환하는 멤버 메서드입니다.
it++ : 다음 요소를 가리킬 수 있게 합니다. ++ 연산자를 오버로드한 것입니다.
*it : * 연산자를 오버로드한 것으로, 포인터와 같은 흉내를 하게 했습니다.
컨테이너 클래스의 종류
- vector : 동적인 배열
- list : 링크드 리스트
- deque : 배열과 링크드 리스트의 장점을 모은 컨테이너(원소 접근 시간 빠름, 원소 제거 속도 빠름)
- map : 원소를 가리키는 인덱스까지도 다양한 타입을 사용할 수 있는 컨테이너
*STL의 철학 - 최소한의 소스 수정으로 컨테이너를 다른 것으로 교체한다.
예를 들어, list 클래스를 사용한 코드를 vector 클래스로 변경하여 사용하고 싶다면 list라고 적힌 부분을 vector로 바꿔주기만 하면 됩니다.
●STL 알고리즘
STL 알고리즘은 STL에서 제공하는 함수들을 의미합니다. 정렬, 검색과 같은 함수들이 이에 속합니다.
ex) sort() 정렬 함수
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
std::vector<char> vec;
vec.push_back('e');
vec.push_back('b');
vec.push_back('a');
vec.push_back('d');
vec.push_back('c');
sort(vec.begin(), vec.end());
cout << "vector 정렬 후" << endl;
vector<char>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
cout << *it;
return 0;
}
sort() 함수는 vector 클래스 객체뿐만 아니라 일반적인 배열도 정렬할 수 있습니다.
*STL의 철학 2 - 컨테이너와 알고리즘이 서로 독립적이다.
sort() 함수는 vector에만 특화된 정렬이 아닌 모든 컨테이너에 대해서 정렬시킬 수 있는 것처럼(list 클래스 제외) 서로 독립적으로 운영이 됩니다.
유용한 알고리즘
- find() : 선형 검색 알고리즘(첫번째부터 하나씩 비교)
- replace() : 특정 값 가진 원소 찾아서 교체
- reverse() : 원소 순서 뒤집음
- sort() : 오름차순 정렬
- binary_search() : 이진 탐색 알고리즘
●제너릭 프로그래밍
제너릭 프로그래밍(Generic Programming)이란 프로그램을 만드는 방법론 중 하나이며, 정보의 타입과 정보를 처리하는 알고리즘을 분리하는 것을 중요시하고 있습니다.
타입과 알고리즘을 분리하게 되면 여러 가지 장점을 갖게 됩니다.
1) 타입과 알고리즘 간 불필요한 연관성이 제거됩니다.
2) 재사용성이 증가합니다.
3) 확장이 용이합니다.
STL(Standard Template Library)에는 자주 사용하는 유용한 클래스와 함수들이 들어있는 템플릿을 사용해서 만들어진 라이브러리입니다. 이 안에는 링크드 리스트 클래스, 동적 배열 클래스, 정렬 함수, 검색 함수 등과 같이 범용적인 클래스와 함수들이 있습니다.
1) 확장이 용이하다.
STL의 클래스와 함수는 템플릿으로 만들어져 있기 때문에 코드를 간단하게 할 수 있습니다.
2) STL은 표준이다.
STL은 표준이기 때문에 지구에 있는 모든 프로그래머들이 작성해놓은 코드를 쉽게 알아볼 수 있습니다.
3) STL은 직접 만든 것보다 효율적이고 안전하다.
STL은 전문가들이 만들어 놓은 것이기 때문에 효율적이고 안전합니다.
●STL 컨테이너
컨테이너란 다수의 정보를 담는 역할을 하는 클래스를 말합니다. 링크드 리스트, 동적 배열, 큐, 맵 등의 클래스들을 컨테이너라고 부릅니다.
ex) list 클래스
#include <list>
#include <iostream>
int main()
{
std::list<int> intList;
for (int i = 0; i < 10; i++)
intList.push_back(i);
intList.remove(5);
std::list<int>::iterator it;
for (it = intList.begin(); it != intList.end(); it++)
std::cout << *it << std::endl;
return 0;
}
링크드 리스트와 같기 때문에 알기 매우 쉽습니다.
std::list<int> : std 네임스페이스 안 list 템플릿 클래스 객체를 선언하여서 int형을 담을 수 있는 리스트를 만듭니다.
push_back(data) : 리스트 맨 끝에 내용을 추가합니다.
remove(data) : 데이터를 보관하고 있는 노드를 찾아서 제거합니다.
std::list<int>::iterator : std 네임스페이스 안 list 템플릿 클래스 안 iterator 클래스 객체를 선언하여서 노드의 위치를 가리키게 합니다.
begin(), end() : 시작과 끝을 반환하는 멤버 메서드입니다.
it++ : 다음 요소를 가리킬 수 있게 합니다. ++ 연산자를 오버로드한 것입니다.
*it : * 연산자를 오버로드한 것으로, 포인터와 같은 흉내를 하게 했습니다.
컨테이너 클래스의 종류
- vector : 동적인 배열
- list : 링크드 리스트
- deque : 배열과 링크드 리스트의 장점을 모은 컨테이너(원소 접근 시간 빠름, 원소 제거 속도 빠름)
- map : 원소를 가리키는 인덱스까지도 다양한 타입을 사용할 수 있는 컨테이너
*STL의 철학 - 최소한의 소스 수정으로 컨테이너를 다른 것으로 교체한다.
예를 들어, list 클래스를 사용한 코드를 vector 클래스로 변경하여 사용하고 싶다면 list라고 적힌 부분을 vector로 바꿔주기만 하면 됩니다.
●STL 알고리즘
STL 알고리즘은 STL에서 제공하는 함수들을 의미합니다. 정렬, 검색과 같은 함수들이 이에 속합니다.
ex) sort() 정렬 함수
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
std::vector<char> vec;
vec.push_back('e');
vec.push_back('b');
vec.push_back('a');
vec.push_back('d');
vec.push_back('c');
sort(vec.begin(), vec.end());
cout << "vector 정렬 후" << endl;
vector<char>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
cout << *it;
return 0;
}
sort() 함수는 vector 클래스 객체뿐만 아니라 일반적인 배열도 정렬할 수 있습니다.
*STL의 철학 2 - 컨테이너와 알고리즘이 서로 독립적이다.
sort() 함수는 vector에만 특화된 정렬이 아닌 모든 컨테이너에 대해서 정렬시킬 수 있는 것처럼(list 클래스 제외) 서로 독립적으로 운영이 됩니다.
유용한 알고리즘
- find() : 선형 검색 알고리즘(첫번째부터 하나씩 비교)
- replace() : 특정 값 가진 원소 찾아서 교체
- reverse() : 원소 순서 뒤집음
- sort() : 오름차순 정렬
- binary_search() : 이진 탐색 알고리즘
●제너릭 프로그래밍
제너릭 프로그래밍(Generic Programming)이란 프로그램을 만드는 방법론 중 하나이며, 정보의 타입과 정보를 처리하는 알고리즘을 분리하는 것을 중요시하고 있습니다.
타입과 알고리즘을 분리하게 되면 여러 가지 장점을 갖게 됩니다.
1) 타입과 알고리즘 간 불필요한 연관성이 제거됩니다.
2) 재사용성이 증가합니다.
3) 확장이 용이합니다.
댓글
댓글 쓰기