728x90

개발 Study 43

#42. 스마트 포인터

스마트포인터 종류 1. unique_ptr 2. shared_ptr 3. weak_ptr "스마트 포인터를 사용 하기 위해서는 #include 헤더를 추가해주어야 한다." - unique_ptr -> 포인터를 단독으로 소유하며, 복사나 대입이 불가함. * 클래스 멤버 변수로 활용 할 때 좋음 * 지역 변수로 활용 할 때 좋음 * STL벡터에 포인터를 저장할 때 좋음 -> 벡터를 클리어 하게 되면 자동적으로 포인터를 지워줌 - shared_ptr -> 두개의 포인터를 소유하며, 포인터를 다른 shared_ptr과 공유할 수 있음(레퍼런스 카운팅 기반) * 어떠한 shared_ptr에게도 참조되지 않을 때(레퍼런스카운트가 0일 때) 포인터는 소멸됨 * 참조카운트를 감소 시킬 때는 .reset()을 해줌 - ..

개발 Study 2021.11.12

#41. 람다식의 사용

람다식은 위와 같이 4개의 부분으로 되어있다. #개시자(introducer) -> 해당 부분에 외부 변수를 넣는다면, 람다 함수가 이를 캡쳐하여 이 변수를 람다 내부에서 이용 할 수 있게 한다. 보통 [&] 레퍼런스 형태로 가져오거나 [=] 값을 가져오는 형태로 쓴다. #인자(parameters) -> 이 부분은 람다가 실행 될 때 받을 인자들을 써넣는다. 일반적으로 함수에서 매개변수를 지정하듯이 (int _i) 와 같이 사용하면 된다. #반환 타입(return type) -> 그 다음은 ->후에 반환타입을 써주면 된다. 위 그림에서는 int를 return 한다고 보면 된다. #함수의 몸통(statement) -> 람다 내부에서 실행 할 내용을 적어주면 된다. 이건은 조건자를 쓰는 for_each문 같은..

개발 Study 2021.11.01

#40. Map

#Map 맵을 사용하기 위해선 #include 을 해주어야 한다. 맵은 key값과 value값으로 나누어져 있으며 한 쌍을 이룬다. 따라서 key값과 value값에 대해 각각 자료형을 명시해주어야 한다. map MapInt; 이때 Map은 여러방식으로 원소를 삽입 할 수 있지만 가장 간단한 방법은 emplace이다. MapInt.emplace(key값, value값) 으로 삽입 할 수 있다. -> emplace는 vector나 list에서도 사용이 가능하며, emplace_back, emplace_front 등으로 사용한다. Map은 pair형식이다 따라서 범위기반 포문을 사용할 때에도 for(auto i : MapInt)가 아닌 for(auto pair : MapInt)으로 사용하여야 한다. 이때 pa..

개발 Study 2021.05.26

#39. List

list의 사용을 위해서는 #include 를 해주면 된다. 리스트는 아래와 같이 선언한다. list 변수명; 리스트는 벡터와는 달리 앞 뒤 모두 원소삽입이 가능하다. push_back, push_front list는 노드기반의 컨테이너이기 때문에, 인덱스접근이 불가능 즉, []의 사용이 불가능하다 listInt[2] -> 불가능! 따라서 원소를 순회하기 위해서는 반복자를 이용해야 하는데 아래와 같다 list::iteratoriter_begin=listInt.begin(); for(;iter_begin!=listInt.end() ; ++iter_begin) cout list는 배열 기반이 아니기 때문에 sort함수를 사용 할 수 없다. 멤버함수의 sort를 사용하면 된다. listInt.sort(조건자)..

개발 Study 2021.05.24

#38. 조건자

#알고리즘 -> 알고리즘을 사용하여 오름차순, 내림차순 등을 할 수 있다. 알고리즘을 사용하려면 #include 을 추가해야한다. 1. 정렬 sort sort(시작위치, 마지막원소 다음 위치, 조건자) => sort(vecInt.begin(), vecInt.end(), Less); 이와 같이 알고리즘을 사용할 때 조건자를 사용하게 되는데 조건자는 다음과 같이 만든다. #조건자 -> bool 타입의 값을 반환하는 함수 포인터, 함수 객체로 만든 것이다. 전역에 조건을 설정해주면 된다. template bool Less(T& _a, T& _b) { return _a count_if(vecInt.begin(), vecInt.end(), OddCnt); 조건자가 true일때의 개수를 반환함 # 조건자 templ..

개발 Study 2021.05.23

#37. Vector

#Vector -> 템플릿이다. 백터 사용을 위해서 #include 를 추가해주고 vector 변수명; 으로 해주면 된다. 1. 원소 삽입 변수명.push_back(자료); #include void main() { vector vecint; vecint.push_back(10); } 2. 원소 삭제 (뒤에서 부터) 변수명.pop_back(); -> 맨 뒤에서 부터 삭제된다. 3. 원소 개수 및 메모리 할당 개수 변수명.size(); -> vector에 저장된 원소의 개수를 반환하는 함수 변수명.capacity(); -> vector에 할당 된 메모리의 개수 -> 할당 된 메모리 수 이기 때문에, 원소를 삭제 하여도 공간이 줄어 들거나 하지 않는다. -> vector의 메모리 할당 방식 vector는 메모..

개발 Study 2021.05.23

#36. STL (Standard Template Library) 정의

#STL (Standard Template Library) STL은 표준에 등록된 템플릿들의 모음이다. STL은 컨테이너, 알고리즘, 함수 객체, 반복자 로 구성되어 있다. 컨테이너는 데이터를 저장하는 객체이다. 이 컨테이너는 배열기반의 vector 노드기반의 list, map 의 종류가 있다. 배열 기반은 연속된 메모리를 사용하여 저장한다. 노드 기반은 비 연속된 메모리에 저장을 하지만 포인터로 서로 연결해 두는 것이다. 여기서 vector와 list는 표준 시퀀스 컨테이너로, 선형적인 구조를 가지고 있다. map은 표준 연관 컨테이너로, 비선형적인 구조를 가지고 있다. 구분 Vector List Map 컨테이너의 종류 동적배열 기반 노드 기반 트리 기반 메모리 저장 방식 배열 노드 노드 원소 배치방법..

개발 Study 2021.05.22

#35. 클래스 템플릿

#클래스에서의 템플릿 #include "stdafx.h" #include using namespace std; template class CLS { T m_a; public: CLS(T _a) { m_a = _a; } }; void main() { CLS cls(10); } 위 코드와 같이 클래스에서 템플릿을 이용해 자료형을 사용자 입맛에 맞게 설정하여 객체를 생성할 수 있다. 위처럼 템플릿클래스는 컴파일러가 코드라인을 컴파일 할 때 클래스의 원형을 만들기 때문에 헤더파일만 include 할 경우 정의부 정보를 알 수가 없다. 정의부를 알 수 없기 때문에 클래스 원형을 만들 수가 없다. 또한 템플릿은 파일 분할시에 매 함수마다 template 를 명시해야하는 귀찮음이 있다. (명시를 한다 해도 클래스 원..

개발 Study 2021.05.21

#34. Template 및 inline

# 함수 템플릿 -> 사용자가 템플릿을 만든 것을 함수 템플릿이라고 한다. 함수를 만들 때 일반적으로 매개변수나 반환값의 타입을 명시해준다. 하지만 템플릿은 자료형을 별도로 명시하지 않아도 된다. 템플릿은 다음과 같이 만든다 template T Add(T _a, T _b) { return _a+_b; } 위에서 T는 T1, T2 또는 다른 문자를 사용해도 상관 없다. T라는 타입을 받아서 T타입으로 반환하고 T타입의 _a와 _b를 받아서 둘을 더한 것을 return 한다는 뜻이다. 이렇게 정의를 하고 사용을 할 때에는 Add(10,20); 이런식으로 를 사용하여 안에 T가 어떤 자료형인지 알려줘야한다. #include "stdafx.h" #include using namespace std; templat..

개발 Study 2021.05.20