[42seoul] 4 circle - CPP Module 08

하이초·2023년 1월 17일
0

42seoul

목록 보기
9/11
post-thumbnail

CPP08 github 😋

cpp08

드디어 cpp08!!!!! cpp08!!!!
진짜 진짜 지겨웠다. 이제 마지막!!!!!
cpp08은 STL을 사용할 수 있다. 즉, 컨테이너와 알고리즘 헤더를 사용할 수 있다!! 예~!
사실 cpp로 알고리즘 풀기를 아주아주 잠깐 깔짝이다 와서 vector나 컨테이너 다 잘 모르긴 하는데 이번 기회에 알아보자고?
알고리즘은 더 모르지만 한 번 가보자고??!

1. ex00

👀 ex00은 easyfind라는 함수를 만드는 것인데 역시 템플릿 함수로 템플릿 인자를 받아야 하고 이 T 인자는 인티져형 컨테이너다. 그럼 과연 컨테이너란 뭘까?

🥨 container

  • STL 컨테이너는 같은 타입의 여러 객체를 저장하는 일종의 집합이다. 자료구조의 총체라고 볼 수 있으려나..
  • 컨테이너는 클래스 템플릿으로 컨테이너에 포함할 요소의 타입을 명시해야한다.
  • 컨테이너에는 복사 생성과 대입을 할 수 있는 타입의 객체만을 저장할 수 있다.
  • 컨테이너는 요소의 추가 및 제거를 포함한 다양한 작업을 도와주는 여러 멤버 함수를 포함하고 있다.
  • 반복자!! 이터레이터가 존재한다!!
  • 컨테이너의 종류는 크게 아래 3가지 유형으로 구분된다.
    1) 시퀀스 컨테이너: 선형 저장. 특별한 제약이나 규칙이 없는 가장 일반적인 컨테이너
    vector, deque, list, forwad_list
    2) 연관 컨테이너: 데이터를 일정 규칙에 따라 조직화하여 저장하고 관리하는 컨테이너
    set, multiset, map, multimap
    3) 컨테이너 어댑터: 간결함과 명료성을 위해 인터페이스를 제한한 시퀀스나 연관 컨테이너의 변형. 단 반복자를 지원하지 않으므로 stl 알고리즘에서는 사용할 수 없다.
    stack, queue, priority_queue

🥨 iterator

  • iterator는 일종의 포인터로, iterator 타입의 iter 객체를 선언해 컨테이너의 특정 위치에 접근할 수 있다

  • 인덱스를 통해 배열을 순회하는 것이 아닌 어떤 객체에서나 동일하게 사용할 수 있도록 통일해서 cpp에서 제공하는 generic 포인터 객체라고 생각하면 된다고 한다 😇

  • 각 타입에 ::iterator 또는 ::const_iterator를 뒤에 붙여주면 사용이 가능하다.

    vector<int>::iterator iter;
    • 이와 관련하여 과제에서 typename T::iterator와 같이 사용을 했는데 typename없이 사용하면 이게 클래스 내부의 멤버변수라고 생각할 수 있다. 컴파일러는 타입이 아니라고 가정한다. 따라서 typename 키워드를 통해 이게 type이란 것을 알려주어야 한다. 이런걸 의존타입이라고 하는데, 어떤 것에 대한 의존인지를 알려주어야.. 한다...
  • iterator에서 사용하는 몇가지 멤버 함수를 알아보자
    1) iter
    2) iter++
    3) iter--
    4) iter1 == iter2
    5) iter1 != iter2
    6) begin(객체): 객체의 시작 주소를 가지는 iterator 객체를 리턴
    7) end(객체): 객체의 끝 주소를 가지는 iterator 객체를 리턴

  • 🍄 어떻게 쓰냐?

iter = begin(객체)
while (iter != end(객체))
	iter++;

위 코드와 같은 형태로 반복할 수 있지롱.

iter = v.begin() + 2
*iter // 세번째 원소 값 리턴

또 위 코드 처럼 간접 참조가 가능하다!

  • 컨테이너마다 지원하는 종류의 반복자가 다르다고 한다.
    1) 입력 반복자
    2) 출력 반복자
    3) 순방향 반복자
    4) 양방향 반복자
    5) 임의접근 반복자

🥨 vector

  • 벡터 객체는 요소가 추가되거나 삭제될 때마다 자동으로 메모리를 재할당하여 크기를 동적으로 변경하는 배열이다.

  • 자주 쓰는 멤버 함수
    1) front()
    2) back()
    3) push_back()
    4) pop_back()

🥨 std::algorithm::find()

#include <algorithm>

template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val);
  • 범위 안에서 원하는 값을 찾는 함수
  • first부터 last '전' 까지 원소들 중 val과 일치하는 첫 번째 원소를 가리키는 반복자를 리턴한다
  • 만약 일치하는 원소를 찾지 못할 경우 last를 리턴한다
  • 이 함수는 원소를 비교할 때 operator==를 사용하며 string의 find함수와는 다르다.

🥨 std::distance(iterator_begin, iterator_end)

  • iterator 사이의 크기를 반환

2. ex01

👀 ex01은 span 클래스를 만들어서 vector에 대해 더 알아보는 그런 과제였다.

🥨 벡터를 초기화 해보자!

vector<int> v = { 1, 1, 1 }; // 원소 직접 할당하기 <- 98에서는 안된다.. ㅠ
vector<int> vec(3); // 크기 3짜리 int형 벡터 만들고 기본값 0으로 자동 초기화 하기
vector<int> vec(3, -1); // 크기 3짜리 int형 벡터 만들고 사용자 지정값 -1로 자동 초기화 하기
vector<int> vec(vec1); // 벡터로 초기화하기

🥨 std::sort

  • sort(v.begin(), v.end()) : 오름차순 정렬
  • sort(v.begin(), v.end(), compare): 사용자 지정 순으로 정렬 가능

3. ex02

👀 ex02는 stack에 대해 알아보는 과제였는데.. 진짜 할 게 많아서 어디서부터 어디까지 정리를 해야 하는지도 좀.. 어렵다.. 또륵

🥨 stack

  • 일단 스택은 위에서 살펴본 것처럼 컨테이너 어뎁터로 기본적으로 이터레이터를 지원하지 않는다.
  • 하지만 과제에 따라 우리는 이터레이터가 가!능!한! 스택을 만들어야 한다.
   template<class _Ty,
	class _Container = deque<_Ty> >
	class stack
	{ 
    // ...
    
    protected:
	_Container c;	// the underlying container
	}; 
  • 이게 기본적인 스택 라이브러리 구조라고 한다. 여기서 봐야할 건 프로텍티드에 있는 _Container c다. 이 멤버 변수를 통해서 우리는 스택 내부의 deque에 접근할 수 있게 된다.
  • 스택은 컨테이너 어댑터이지만 기본적인 내부 동작 방식은 선형적 컨테이너들을 활용하여 이루어져있다. 바로 deque! 따라서 c로 접근 시 deque의 멤버 변수를 사용할 수 있게 되는 것이다.

🥨 typedef

  • 그렇다고 막 쓸 수는 없다. 별칭을 지어줘야 좀 더 짧게 쓸 수 있다 안지어주면 엄청 길게 써줘야 한다 typename부터 해가지고 블라블라~!
  • stack 내부에 container_type으로 container가 별칭으로 규정되어있다. 마이크로소프트 문서를 참고하면 좋다.
  • 따라서 typedef typename MutantStack<T>::stack::container_type::iterator와 같은 형태로 스택 내부의 이터레이터에 접근이 가능하다.
  • 일단은 여기까지..ㅠ

🚴 CPP 끝내보자고! 안뇽!!

profile
개발국대가 되는 그 날까지. 지금은 개발 응애.

0개의 댓글