본문 바로가기

Language/C++

(33)
[C++] STL - pair, tuple pair은 두 객체를 하나의 객체로 취급할 수 있게 묶어주어 데이터 쌍 역할을 한다. #include 헤더 파일에 존재하는 STL이지만 algorithm, vector과 같은 헤더파일에서 이미 include 하고 있기 때문에 따로 utility를 include 하지 않아도 사용 가능하다. 변수 선언 값을 할당하는 방법은 다음 3가지 중 선택 pair p1; p1.first = 10; p1.second = 'c'; pair p2; p2 = make_pair(40, 30); pair p3; p3 = {1, "sample"}; pair 값 참조 pair에 저장된 데이터를 불러오려면 순서대로 .first와 .second를 사용한다. tuple은 pair의 확장 버전이라고 생각하면 된다. 2개 이상의 값을 하나로..
[C++] cout, cin 실행 속도 높이기 (시간 초과 해결법) printf, scanf를 사용했을 때 A/C를 받았지만 cout, cin을 사용했을 때 시간초과가 나는 경우가 있다. 이는 cout, cin이 printf, scanf보다 실행 속도가 느리기 때문에 발생한다. 평소에는 시간 차이가 별로 없지만 입력이나 출력이 몇 십만 정도로 많아지면 시간이 크게 차이나게 된다. cout과 cin의 속도를 빠르게 하기 위해서는 아래 코드를 추가해 주면 된다. ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false); ios::sync_with_stdio는 cpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 한다. iostream, stdio의 버퍼를 모두 사..
[C++] STL - 컨테이너 어댑터(container adapter) [stack, queue] stack 스택 컨테이너는 vector 클래스를 기반으로 한다. 스택의 메모리 구조는 LIFO(Last In First Out)를 따르는 자료구조이다. DFS(Depth First Search, 깊이 우선 탐색)나 특별한 알고리즘이 필요한 상황이 아니라 문제 상황을 구현하는 데 LIFO의 구조를 가지고 있다고 판단되는 문제를 풀 때 사용된다. #include stack 스택명; 스택의 멤버함수를 확인하면 다음과 같다. s.size() : s의 원소의 개수를 반환(메모리 용량이 아님) s.empty() : s가 비어있는지 확인, 비어있으면 true를 반환한다. s.top() : s의 제일 위에 위치한(제일 나중에 저장된) 원소를 반환 s.push(x) : s에 x값을 저장 s.pop() : s의 제일 위에..
[C++] STL - 연관 컨테이너(associate container) [set, multiset, map, multimap] 연관 컨테이너(associate container) 연관 컨테이너는 key와 value를 통해 관계있는 값을 묶어서 저장하는 컨테이너이다. 따라서 key와 value를 통해 요소에 빠른 접근은 가능하지만 연관 컨테이너는 자체적인 기준을 가지고 요소를 정렬하기 때문에 삽입되는 요소의 위치를 지정할 수 없다. 주로 균형 이진 트리(balanced binary search tree)나 해시 함수(hash function)을 사용해 구현된다. set & multiset set은 key만 가지고 있는 연관 컨테이너이다. 따라서 저장하는 값이 key가 되고 오름차순으로 정렬된 위치에 요소를 삽입하여 검색 속도가 매우 빠르기 때문에 데이터의 존재 유무를 파악하는데 유용하다. 다른 정렬 기준을 사용하고 싶다면 템플릿 ..
[C++] STL - 시퀀스 컨테이너(sequence container) [vector, deque, list] 시퀀스 컨테이너(sequence container) 특징 메모리 상에서 모든 요소가 직전 순서로 배치되어 순서가 존재해야 한다. 즉, 첫 번째 요소와 마지막 요소를 제외한 모든 요소는 앞뒤로 컨테이너의 요소가 존재해야 한다. 반복자가 이동할 때 요소의 순서가 변경되지 않음을 보장하기 위해 반복자는 최소 순방향 반복자를 사용해야 한다. 시퀀스 컨테이너는 직선 순서로 배치되어 명확한 순서가 존재하므로 특정 위치에 대한 참조가 가능해야 한다. vector 벡터는 동적 배열의 클래스 템플릿으로 가장 기본이 되는 컨테이너이다. 벡터는 데이터가 들어가고 나올 수 있는 입출구가 뒤쪽 하나이며 앞쪽은 막혀있는 형태이다. 따라서 데이터를 넣을 때도 뒤에서부터 쌓이고 데이터를 꺼낼 때는 맨 뒤에서부터 뺄 수 있다. 시퀀스..
[C++] STL - STL 구성 요소 STL 구성 요소에는 컨테이너, 반복자, 알고리즘이 존재한다. 컨테이너(container) 컨테이너는 같은 타입의 여러 객체를 저장하는 객체로 일종의 객체들의 집합이라고 할 수 있다. 컨테이너는 클래스 템플릿으로 작성되어 있어 컨테이너 변수를 생성할 때 템플릿 인자로 요소의 타입을 명시해야 한다. 따라서 대입할 수 있는 타입의 객체만을 저장해야하며 복사 생성 또한 가능하다. 또한 요소의 추가 및 제거를 포함해 다양한 기능을 수행하는 멤버 함수가 존재한다. 컨테이너 종류 종류 설명 컨테이너 시퀀스 컨테이너 특별한 규칙이 없는 일반적인 컨테이너. 순서가 있는 선형 구조 vector, deque, list, forward_list 연관 컨테이너 특정 규칙에 의해서 자동으로 정렬, 저장, 관리하는 컨테이너. 순..
[C++] STL - 스마트 포인터(smart pointer) 스마트 포인터(smart pointer) 자바의 경우 garbage collector을 통해 메모리를 관리하지만 C++은 사용자가 스스로 메모리를 할당 해제를 통해 관리해야 한다. c에선는 malloc, free로 메모리를 할당 및 해제하고 C++은 new, delete를 사용한다. 이때 할당받은 메모리를 해제하지 않을 경우 프로그램은 계속 사용하고 있는 메모리로 인지하고 해당 메모리를 사용하지 않는 메모리 누수(memory leak)가 발생한다. 이와 같은 메모리 누수를 방지하기 위해 스마트 포인터를 제공한다. 스마트 포인터는 포인터처럼 사용하는 클래스 템플릿으로 메모리를 자동으로 해제해준다. 즉, delete를 자동으로 수행한다. 이런 SmartPtr 클래스를 사용하면 객체의 사용이 끝나면 자동으로 ..
[C++] STL - 클래스 템플릿(class template) 클래스 템플릿(class template) 함수 템플릿은 기능만 정의되고 타입이 정의되지 않은 함수의 일반화였다. 클래스 템플릿(class template)도 마찬가지로 클래스의 일반화이다. 함수 템플릿과 다른 점이 있다면 함수의 경우 명시적으로 템플릿 인수를 작성하지 않아도 동작했지만 클래스 템플릿은 무조건 템플릿 인수를 명시해주어야 한다. 이유는 클래스의 객체를 생성하는 과정에 있다. 인스턴스화를 진행할 때 해당 객체에 대한 메모리를 할당하고 생성자를 호출하게 된다. 하지만 클래스 템플릿의 데이터 타입이 결정되려면 생성자가 호출되어야 한다. 따라서 명시적으로 템플릿 인수를 작성하지 않을 경우 어떤 타입에 대한 메모리를 할당해야 하는지 모르기 때문에 객체를 생성할 수 없기 때문에 객체 생성 시 템플릿 ..