드디어 cpp08!!!!! cpp08!!!!
진짜 진짜 지겨웠다. 이제 마지막!!!!!
cpp08은 STL을 사용할 수 있다. 즉, 컨테이너와 알고리즘 헤더를 사용할 수 있다!! 예~!
사실 cpp로 알고리즘 풀기를 아주아주 잠깐 깔짝이다 와서 vector나 컨테이너 다 잘 모르긴 하는데 이번 기회에 알아보자고?
알고리즘은 더 모르지만 한 번 가보자고??!
👀 ex00은 easyfind라는 함수를 만드는 것인데 역시 템플릿 함수로 템플릿 인자를 받아야 하고 이 T 인자는 인티져형 컨테이너다. 그럼 과연 컨테이너란 뭘까?
🥨 container
vector, deque, list, forwad_list
set, multiset, map, multimap
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 // 세번째 원소 값 리턴
또 위 코드 처럼 간접 참조가 가능하다!
🥨 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);
반복자
를 리턴한다operator==
를 사용하며 string의 find함수와는 다르다.🥨 std::distance(iterator_begin, iterator_end)
👀 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)
: 사용자 지정 순으로 정렬 가능👀 ex02는 stack에 대해 알아보는 과제였는데.. 진짜 할 게 많아서 어디서부터 어디까지 정리를 해야 하는지도 좀.. 어렵다.. 또륵
🥨 stack
template<class _Ty,
class _Container = deque<_Ty> >
class stack
{
// ...
protected:
_Container c; // the underlying container
};
🥨 typedef
container_type
으로 container가 별칭으로 규정되어있다. 마이크로소프트 문서를 참고하면 좋다.typedef typename MutantStack<T>::stack::container_type::iterator
와 같은 형태로 스택 내부의 이터레이터에 접근이 가능하다.