[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