표준 템플릿 라이브러리(STL)

이재원·2024년 6월 6일
0

C++

목록 보기
11/11

STL

STL은 C++의 표준 라이브러리 중 하나로, 템플릿으로 작성된 많은 제네릭 클래스와 함수 라이브러리이다.

std이름 공간에 작성되어 있으며, 사용하고자 하는 클래스나 함수의 헤더파일을 포함하여 사용하면 된다.

컨테이너(container) - 템플릿 클래스

데이터를 저장하고 검색하기 위해 담아두는 자료 구조를 구현한 클래스로서 리스트, 큐, 스택, 맵, 셋, 벡터 등이 있다.

vetor 컨테이너

vector는 가변 길이 배열을 구현한 제네릭 클래스이다. 내부에 배열을 가지고 원소를 저장, 삭제, 검색하는 멤버 함수들을 제공한다.

vector는 스스로 내부 크기를 조절하므로 개발시 크기에 대한 고민을 하지 않아도 된다. 인덱스는 배열과 마찬가지로 0부터 시작한다.

멤버 함수와 연산자 함수

멤버 함수설명
void push_pack(T& element)벡터의 끝에 element 추가
T& at(int idx)idx 위치의 요소에 대한 참조 반환
iterator begin()벡터의 마지막 요소 다음에 대한 반복자를 반환한다.
bool empty()벡터가 비어 있는지에 대한 여부 반환
iterator erase(iterator it)벡터에서 It이 가리키는 요소 삭제
int size()벡터의 유효 크기(요소 개수) 반환
int capacity()벡터의 할당 크기 반환
T& operatr[](int idx)idx 위치의 요소에 대한 참조 반환하며, 수정도 가능하다.
vector& operator=(vector& rh)벡터 복사

아래는 벡터의 생성과 벡터를 다루는 사례들이다.

예제 1

#include <iostream>
#include <vector>
using namespace std;

int main() {
  vector<int> v;

  // 벡터에 정수 삽입
  v.push_back(10);
  v.push_back(20);
  v.push_back(30);

  for(int i = 0; i < v.size(); i++)
    cout << v[i] << " ";
  cout << endl;

  v[0] = 1; // 첫 번째 원소 변경
  int m = v[2];
  cout << m << endl;
  
  v.at(2) = 5;
  for(int i = 0; i < v.size(); i++)
    cout << v[i] << " ";
  cout << endl;

  return 0;
}

// 출력
// 10 20 30 
// 30
// 1 2 5 

예제 2

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
  vector<string> sv; // 문자열 벡터 생성
  string name;

  cout << "이름을 5개 입력하라" << endl;
  for(int i = 0; i < 5; i++) {
    cout << i + 1 << ">>";
    getline(cin, name);
    sv.push_back(name);
  }
  name = sv.at(0);
  for(int i = 1; i < sv.size(); i++) {
    if(name < sv[i])
      name = sv[i];
  }
  cout << "사전에서 가장 뒤에 나오는 이름은 " << name << endl;
  
  return 0;
}

iterator - 컨테이너 원소에 대한 포인터

iterator는 반복자라고 불리는 것으로, 컨테이너의 원소들을 하나씩순회 접근하기 위해 만들어진 컨테이너 원소에 대한 포인터이다.

C++11 이후부터 사용 가능하다.

vector<int>::iterator it;

it 변수는 Int 값을 원소로 가지는 벡터의 원소를 가리키는 포인터이다.

vector<int> v;
it = v.begin();

v.begin()은 벡터 v의 첫 번째 원소의 주소를 리턴하므로, it은 벡터 v에 있는 첫 번째 원소를 가진다.

it++;

++연산자나 --연산자를 통하여 다음 원소나 이전 원소를 가리키게 할 수 있다.

int n = *it;
*it = 5;

it은 포인터이므로 n에 it이 가리키는 값을 저장시킬 수 있고, 다른 값으로 바꿀 수도 있다.

it = v.end()

v.end()는 마지막 원소의 다음 위치에 대한 포인터를 가져온다.

for(it = v.begin(); it != v.end(); it++) {
	int n = *it;
	cout << n << endl;
}

Iterator를 통해서 vector의 모든 원소를 출력하는 코드이다.

아래는 위 과정들을 그림으로 나타낸 것이다.

algorithm - 템플릿 함수

컨테이너의 원소에 대한 복사, 검색, 삭제, 정렬 등의 기능을 구현한 전역 템플릿 함수로, iterator와 함께 연동하여 사용한다.

sort() 함수

sort() 함수는 두 개의 매개변수를 받는다. 첫 번째로는 정렬할 요소의 시작 주소를 받고, 두 번째로는 정렬할 마지막 요소 다음 주소를 받는다.

vector<int> v;

// 벡터의 첫 번째 요소부터 v.begin() + 2까지 3개의 요소를 정렬
sort(v.begin(), v.begin() + 3);
// 벡터의 3번째 요소에서 v.begin() + 4까지 3개의 요소를 정렬한다.
sort(v.begin() + 2, v.begin() + 5);
// 벡터 전체 정렬
sort(v.begin(), v.end());

예제 코드

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
  vector<int> v;

  cout << "5개의 정수를 입력하세요: ";
  for (int i = 0; i < 5; i++) {
    int n;
    cin >> n;
    v.push_back(n);
  }

  sort(v.begin(), v.end());

  vector<int>::iterator it;

  for (it = v.begin(); it != v.end(); it++)
    cout << *it << ' ';
  cout << endl;

  return 0;
}

출처
명품 C++ Programming - 황기태

profile
20학번 새내기^^(였음..)

0개의 댓글