[STL] 제네릭(generic) 기초 정리

프로그래밍/C/C++ 2014. 2. 9. 03:24

 제네릭이란 무엇인가?

 네이버에서 Generic 이라는 단어를 검색하면

 [문법] 총칭적인

 the generic singular 총칭 단수 <보기 : The cow is an animal>

이라고 검색됩니다. 해석하면 "암소는 동물이다"  소는 분명히 고양이나 개와는 다르지만, "동물"이라는 것으로

총칭할수 있습니다. 그렇다면 왜 총칭하는 것일까요? 어떤 프로그램을 만든다고 할때 어떤 기능이 되야 하는지 고민한뒤

클래스, 맴버함수, 맴버변수등을 작성합니다. 여기서 사용하는 변수의 타입을 총칭화 하면 장점이 있습니다.

1. 템플릿을 이용하면 총칭화된 타입을 사용하는 클래스와 함수를 만들수 있다.

2. 템플릿을 사용하면 타입에 제약을 받지 않은 로직을 기술할수 있다.

그리고 제네릭 프로그래밍을 하기 위해서는 템플릿이 꼭 필요합니다. 그런데 STL은 무엇으로 만들어 졌을까요?

템플릿으로 만들어 졌습니다. STL은 제네릭 프로그램으로 만들어진 가장 대표적인 예중 하나입니다.

두개의 function함수가 있지만, 타입에 따라 다른 함수가 호출됨을 확인할수 있습니다.

첫번째 function함수는 호출1을 출력하고, 두번째 function함수는 호출2를 출력합니다. 

   

         

 

▶ 제네릭을 사용해 펙토리얼 연산

        

 

▶ 제네릭을 사용한 이진수 십진수 변환

     

[STL]기초, 컨테이너(vector, deque, list)

프로그래밍/C/C++ 2014. 2. 9. 03:06

STL이란 무엇인가?

STL이란 C++언어의 "표준 템플릿 라이브러리" Standard Template Library 약자입니다. STL을 간단하
게 말하자면 일반적으로 많이 사용되는 자료구조와 알고리즘을 모은 라이브러리입니다.

 

 

STL은 대부분 알고있는 자료구조와 알고리즘을 제공합니다.

 

컨테이너(Container) 에서는 시퀀스 컨테이너(sequence container)와 정렬 연관 컨테이너가 있습니다.

시퀀스 컨테이너는 Vector, List, Deque 가 있고, 정렬 연관 컨테이너는 Set, Multiset, Map, Multimap이 있습니다.

시퀀스 컨테이너는 index들의 동일한 형식의 객체들이 선형적으로 연결되어 있습니다.

 

 

▶ 시퀀스 컨테이너의 멤버함수

assign

특정 원소로 채운다

clear

모든 원소를 지운다 

swap

두개의 컨테이너 원소를  바꾼다

empth

아무것도 없으면 true 반환 

begin

첫번째 원소의 반복자 반환 

front 

첫 번째 원소의 참조를 반환 

end

마지막 원소의 반복자 반환 

 back

마지막 원소의 참조를 반환 

 rbegin

역방향의 첫번째 원소 반복자 반환 

 rend

역방향의 마지막 원소 다음의 반복자를 반환 

 size

원소의 개수를 반환 

 reserve

지정된 크기만큼의 공간을 확보 

 resize

컨테이너가 담을수 있는 개수를 지정 

push_back 

마지막에 원소를 추가 

 pop_back

마지막 원소를 삭제 

 insert

특정 위치에 원소를 삽입 

 erase

특정 위치의 원소나 지정범위 삭제 

 

▶ 시퀀스 컨테이너의 선언과 초기화

디폴트 생성자 : deque<int>myD;

원소의 개수를 지정 : deque<int>myD(10);

원소의 개수와 값을 초기화 : deque<int>myD(10, 3);

 

▶ STL-Vector

 선형 구조의 가변 배열 방식입니다.

 동일한 형식의 객체를 계속 넣을수 있습니다.

 요소의 개수에 따라 자동으로 메모리 관리를 합니다.

 

☞ vector 예제

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

▶ STL-Deque

 deque는 double ended queue의 줄임말입니다.

 두개의 key를 두어 앞과 뒤를 관리하여, FIFO와 LIFO를 모두 사용할수 있습니다.

 

Vector와 Deque의 단점은 중간의 삽입과 삭제를 수행시 데이터 이동이 있다는 것입니다.(일종의 행렬)

    삽입과 제거가 빈번한 알고리즘에서는 벡터보다는 리스트를 쓰는것이 좋습니다.

 

▶ STL-List

 각 노드는 링크(포인터)로 연결되어 있습니다.

 iterator(반복자)를 사용해 탐색이 가능합니다.

 ☞ List의 단점은 중간에 원소에 접근이 불가능하고, 탐색시 처음부터 검색해야 한다는 점입니다. 

     탐색이 많은 경우 List보다는 Vector혹은 Deque를 쓰는것이 좋습니다.

 

   <List의 탐색>

     List<int>::iterator itr;

     for(itr = myList.begin(); itr != myList.end(); itr++)

     cout << *itr;

 

 List는 sort(정렬)을 지원합니다. [qsort사용불가]

     List.sort(); //오름차순 정렬

     List.sort(greater<T>()); //내림차순 정렬

pthread 함수정리

프로그래밍/C/C++ 2014. 1. 31. 19:39

안드로이드 NDK(리눅스 커널)에서 pthread를 지원한다고 한다.

단일 프로세스에서 동시에 여러작업을 하는것처럼 보여지기위해 스레드를 사용한다.

pthread API 함수를 쓰기 위해서 #include <pthread.h>를 해야한다.

또한 컴파일시 -lpthread 옵션 추가를 해주어야 한다.(미추가시 컴파일 오류 혹은 스레드가 정상으로 작동하지 않음)

 

pthread_t  :  pthread의 자료형을 나타낸다.

 

1. pthread 생성 

int pthread_create(pthread_t *th_id, const pthread_attr_t *attr, void *함수명, void *arg)

 첫번째 인자 : pthread 식별자(thread가 생성되면 thread식별자 값이 주어진다.)

 두번째 인자 : pthread 속성(옵션), 기본적인 thread를 사용할경우 NULL로 설정

 세번째 인자 : pthread 분기함수, 반환값이 void* 타입이고 매개변수도 void* 으로 선언된 함수만 사용할수있다.

                     예) void *threadFunc(void *arg)

 네번째 인자 : 분기할 함수로 넘겨줄 인자값. 어떤 자료형을 넘겨줄 지 모르기 때문에 void 형으로 넘겨주고, 상황에 맞게

                     분기하는 함수 내에서 원래의 자료형으로 캐스팅해서 사용하면 된다.

 ▶ 성공적으로 pthread가 생성된 경우 0을 리턴

 

2. pthread 옵션

int pthread_join(pthread_t th_id, void **thread_return)

 - 특정 pthread가 종료될 때까지 기다리다가 pthread가 종료시 자원 해제

 첫번째 인자 : pthread를 기다릴 id

 두번째 인자 : pthread의 return값(포인터로 받아와야함)

 

int pthread_detach(pthread_t th_id)

 - th_id 식별자를 가지는 pthread가 부모 pthread로 부터 독립한다.

   (pthread_join(..)이 없어도 종료시 자동으로 리소스가  해제됨)

 

void pthread_exit(void *ret_value)

 - 현재 실행중인 thread를 종료시킨다. pthread_exit가 호출되면 cleanup handler가 호출되며 리소스 해제하는 일을 수행

 

void pthread_cleanup_push(void *함수명, void *arg)

 - pthread(exit)가 호출될때 호출된 handler를 정하는 함수(자원 해제용이나 mutex lock해제를 위한 용도로 사용)

 

void pthread_cleanup_pop(int exec)

 - 설정된 cleanup handler를 제거하기 위해서 사용하는 함수(exec 값이 0일 경우 바로 cleanup handler 제거하고 그 외

    의 값을 가질 경우 cleanup handler를 한번 실행한 후 제거한다)

 

pthread_t pthread_self()

 - 현재 동작중인 pthread의 식별자를 리턴.

윈도우 스레드(win thread) - 세마포어예제

프로그래밍/C/C++ 2014. 1. 29. 20:25

멀티스레드 개념 정리

프로그래밍/C/C++ 2014. 1. 28. 03:38

 CPU 코어 하나에 여러개의 스레드를 한 명령어씩 돌아가며 처리한다.

(OS가 각 스레드에게 CPU를 사용할수 있는 시간을 할당 즉 스케줄링 한다. 스케줄 순서에 따라 번갈아가며 수행된다)

 

void thread()
{
    int a = 0;
    int b = 0;
    a++; //명령문 1
    b++;// 명령문 2
    a += b; //명령문 3
}
이러한 쓰레드가 3개가 있다면,
코어
스레드 a의 명령문 1를 수행한다.
스레드 a의 스택정보와 레지스트 정보를 임시 저장한다.

 

스레드 b의 스택정보와 레지스트 정보를 불러온다.
스레드 b의 명령문 1를 수행한다.
스레드 b의 스택정보와 레지스트 정보를 임시 저장한다.

 

스레트 c의 명령문 1를 수행한다
스레드 c의 스택정보와 레지스트 정보를 임시 저장한다.

 

스레드 a의 스택정보와 레지스트 정보를 불러온다.
스레드 a의 명령문 2를 수행한다.

 

다시 스레드 b의...(이하 반복)
를 수행한다.

만약에 코어가 두 개가 있을시에는
상대방 코어가 처리하고 있지 않은 스레드의 명령문을 처리한다.