[lv5] ft_containers(4/6) stack

[(3/6)vectorにもどる] https://note.com/syamashi/n/n329e33f09bb3
[(5/6)mapにすすむ] https://note.com/syamashi/n/n957bb9ca7719

stackは先入れ後出しのデータ配列。1,2,3って入れたら3,2,1って取り出します。

最初からcppreferenceに沿って構築していきます。
https://en.cppreference.com/w/cpp/container/stack

第二引数にContainerの指定ができ、課題の要件よりft::vectorを定義します。
/containers/stack.hpp

#ifndef STACK_HPP
#define STACK_HPP

#include "vector.hpp"

namespace ft {
template <class T, class Container = ft::vector<T> >
class stack {

それに伴って、vector.hppのメンバ変数をprotectedにします。

/containers/vector.hpp

protected:
 // 先頭の要素へのポインター
 pointer first;
 // 最後の要素の1つ前方のポインター
 pointer last;
 // 確保したストレージの終端
 pointer reserved_last;
 // アロケーターの値
 allocator_type alloc;

ちなみに、stackで使用できるContainerは
back()
push_back()
pop_back()
の3つの関数をもっているコンテナに限ります。

・Member Types
・construcor
・destructor
・operator=
・top
・empty
・size
・push
・pop
どれも1行とか、なのでコメントはこれだけ。
・Non-member functions
Q. friend
A. 非メンバ関数のオーバーロードにだけ使用が許可されています。
const のときの比較を非メンバ関数に書きます、が。
比較したい変数cはあいにくprotectedなので、関数外からアクセスできません。
特例として、friendで指定した関数のみアクセスが許可されます。

ちなみに比較のオーバーロードは、
== と <
の2種類で6種類が網羅できます。

/containers/stack.hpp

namespace ft {
template <class T, class Container = ft::vector<T> >
class stack {
 ...

 template <class T_, class Container_>
 friend bool operator==(const ft::stack<T_, Container_>& lhs,
                        const ft::stack<T_, Container_>& rhs);
 template <class T_, class Container_>
 friend bool operator!=(const ft::stack<T_, Container_>& lhs,
                        const ft::stack<T_, Container_>& rhs);
 template <class T_, class Container_>
 friend bool operator<(const ft::stack<T_, Container_>& lhs,
                       const ft::stack<T_, Container_>& rhs);
 template <class T_, class Container_>
 friend bool operator<=(const ft::stack<T_, Container_>& lhs,
                        const ft::stack<T_, Container_>& rhs);
 template <class T_, class Container_>
 friend bool operator>(const ft::stack<T_, Container_>& lhs,
                       const ft::stack<T_, Container_>& rhs);
 template <class T_, class Container_>
 friend bool operator>=(const ft::stack<T_, Container_>& lhs,
                        const ft::stack<T_, Container_>& rhs);
};

//// Non-member function overloads

template <class T, class Container>
bool operator==(const ft::stack<T, Container>& lhs,
               const ft::stack<T, Container>& rhs) {
 return (lhs.c == rhs.c);
}
template <class T, class Container>
bool operator!=(const ft::stack<T, Container>& lhs,
               const ft::stack<T, Container>& rhs) {
 return !(lhs.c == rhs.c);
}
template <class T, class Container>
bool operator<(const ft::stack<T, Container>& lhs,
              const ft::stack<T, Container>& rhs) {
 return (lhs.c < rhs.c);
}
template <class T, class Container>
bool operator<=(const ft::stack<T, Container>& lhs,
               const ft::stack<T, Container>& rhs) {
 return !(rhs.c < lhs.c);
}
template <class T, class Container>
bool operator>(const ft::stack<T, Container>& lhs,
              const ft::stack<T, Container>& rhs) {
 return (rhs.c < lhs.c);
}
template <class T, class Container>
bool operator>=(const ft::stack<T, Container>& lhs,
               const ft::stack<T, Container>& rhs) {
 return !(lhs.c < rhs.c);
}
}  // namespace ft

テストケースを追加しました。
/testfiles/stack.cpp
/testfiles/main.cpp
/testfiles/tester.hpp
https://github.com/syamashi/ft_container/tree/e829249d29fd9ce406db65a89f6ecd72284604c4/newgame

次:(map) https://note.com/syamashi/n/n957bb9ca7719

いいなと思ったら応援しよう!