기타: 123개의 글
[STL] 스택(stack) 기본 예제 컨테이너 어댑터의 종류는 stack, queue, priority_queue 가 있다. 그중 대표적인 컨테이너 어댑터는 stack 이다.stack은 LIFO(Last In First Out) 방식의 시퀀스이다. empty, size, push_back, pop_back, back 의 인터페이스를 지원하는 컨테이너(시퀀스)는 모두 stack 컨테이너 어댑터를 사용하여 LIFO 방식의 스택으로 변환할 수 있다.stack 컨테이너 어댑터의 디폴트 컨테이너는 deque 컨테이너이다.#include #include #include using namespace std; int main(){ stack st; // default 는 deque 컨테이너 사용 //stack st;..
[STL] sort() 정렬 예제 순차열을 정렬하는 sort 알고리즘은 임의 접근 반복자(Random access iterator)를 요구하므로 vector와 deque에 sort() 알고리즘이 가능하다. 다른 컨테이너는 불가능하다.(연관 컨테이너는 컨테이너만의 정렬 기준을 가지고 있기 때문에 sort 알고리즘 적용이 말이 안된다.) sort(v.begin(), v.end()); 위와 같이 vector의 begini과 end를 사용하여 범위를 지정하면, 해당 범위에서 오름차순으로 정렬을 한다. 하지만 필요에 따라 정렬 기준을 변경할 필요가 있다.이럴 경우 함수 객체를 인자로 넘겨주면, 해당 함수 객체의 기준에 따라 정렬을 시도한다. 아래는 less 와 greater를 사용하여 정렬한 예제이다. 2019/..
[STL] find() 함수 예제 find 함수는 iterator 순차열 범위에서 원하는 값을 가진 iterator 반복자 위치를 찾아서 반환한다.만약 해당 값을 찾지 못하면 반환하는 iter 는 end() 를 가리킬 것이다. find() 함수는 순방향 반복자를 요구하기 때문에 순방향 반복자를 지원하는 컨테이너라면 수행할 수 있다. 아래는 find() 함수의 사용 예제 이다. #include #include #include using namespace std; int main(){ vector v; v.push_back(10); v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50); vector::iterator iter; iter = f..
[STL] 반복자 iterator 개념 및 예제 반복자는 컨테이너에 저장된 원소를 순회하고 접근하는 일반화된 방법을 제공한다.반복자는 컨테이너와 알고리즘이 하나로 동작하게 묶어주는 인터페이스 역할을 한다. 이 반복자 덕에 알고리즘은 특정 컨테이너에 종속적이지 않고 독립적이면서도 언제든지 컨테이너와 결합하여 동작할 수 있다. - 반복자는 컨테이너 내부의 원소(객체)를 가리키고 접근할 수 있어야 한다. (* 연산자)- 반복자는 다음 원소로 이동하고 컨테이너의 모든 원소를 순회할 수 있어야 한다. (++, !=, == 연산자 제공) 순차열은 하나의 시작과 하나의 끝을 갖는다. 여기서 반복자는 순차열의 한 원소를 가리킨다.순차열의 시작은 begin() 끝은 end() 이며, end()는 실제 원소의 끝이 아닌 ..
[STL] less, greater, plus, minus 예제 STL 에는 유용하게 사용할 수 있는 함수 객체가 내장돼 있다. less : 첫번째 인자가 두번째 인자보다 작으면 true 반환 (bool)greater : 첫번째 인자가 두번째 인자보다 크면 true 반환 (bool) plus : 두개의 인자를 더한 값 반환minus : 첫번째 인자에서 두번째 인자를 뺀 값 반환 less, greater, plus, minus STL 을 사용하기 위해서 #include 을 사용한다. #include #include using namespace std; int main(){ cout
[C++] 클래스 템플릿 사용 Array 클래스 예제 함수 템플릿과 마찬가지로 클래스 템플릿도 template 키워드를 사용하여 정의할 수 있다. Array 예제를 통해 Template 을 활용하여 다양한 타입을 지원하는 Array 클래스를 작성할 수 있다 #include #include using namespace std; template class Array{ T* buf; int size; int capacity; public: explicit Array(int cap = 100) :buf(0), size(0), capacity(cap){ buf = new T[capacity]; } ~Array() { delete[] buf; } void Add(T data){ buf[size++] = data; ..
[C++] 함수 템플릿 사용 template 템플릿 함수를 사용하면 컴파일러는 클라이언트(호출 측)의 함수 호출 인자 타입을 보고 템플릿 함수의 매개변수 타입을 결정하여 실제 함수인 템플릿 인스턴스 함수를 만들어 낸다. 서버 함수는 일반화된 기능만을 제공하고 클라이언트가 함수의 매개변수 타입을 결정한다.이것은 클라이언트가 타입이 다른 함수를 얼마든지 만들어내므로 대단한 확장성을 갖는다. 함수 템플릿은 함수 앞에 template 키워드를 붙이면 된다.또한, 클라이언트가 매개변수 타입을 결정하도록 타입을 일반화(T 타입)하면 된다. 함수 형식 : template void Print(T a, T b); #include using namespace std; template void Print(T a, T b){..
[C++] 함수객체 기본 예제 함수 객체(Function Object)는 함수처럼 동작하는 객체이다.함수처럼 동작하려면 객체가 operator() 를 정의해야 한다. 아래의 예제를 보면 구조체에서 operator() 연산자를 오버라이딩 하고, main에서 해당 구조체를 선언한 후 함수처럼 호출하였다. #include #include using namespace std; struct Functor1{ void operator()(int n){ cout
[C++] 생성자 타입변환과 explicit C++ 에서 클래스의 객체를 생성할 때 생성자를 사용해서 형변환을 할 수 있다. 아래와 같은 예제에서 class B 는 4개의 생성자를 가지고 있다. class A{ }; class B{ public: B() { } B(A& _a){} B(int n){} B(double d){} }; B 클래스를 생성할 때, 아래와 같이 하면 B b; // B() 생성자 호출b = a; // b = B(a) 암시적 생성자 호출 후 대입b = n; // b = B(n) 암시적 생성자 호출 후 대입b = d; // b = B(d) 암시적 생성자 호출 후 대입 위와 같이 대입을 할때, 해당 타입을 인자로 가지는 생성자가 있다면,형변환이 이루어지며 대입이 된다. 하지만 이러한 대입 ..
[C++] 스마트 포인터, operator*(), operator->() 연산자 오버로딩 스마트 포인터는 일반 포인터의 기능에 몇 가지 유용한 기능을 추가한 포인터처럼 동작하는 객체이다. 일반 포인터를 사용하면 new 연산 후 delete 연산을 호출하지 않으면 메모리 누수가 발생하여 프로그램에 심각한 문제가 된다. 또한, 사용 중에 함수가 종료하거나 예외 등이 발생하면 동적으로 할당한 메모리를 해제하지 못하는 문제가 발생한다.이런 문제들을 스마트 포인터를 사용하여 쉽게 해결할 수 있다. * 간단한 스마트 포인터 예제 class PointPtr{ Point* ptr; public: PointPtr(Point* p) :ptr(p){} ~PointPtr(){ delete ptr; } }; 위와 같이 Poin..