NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
stack.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_STACK_HPP__
2#define NEFORCE_CORE_CONTAINER_STACK_HPP__
3
12
14NEFORCE_BEGIN_NAMESPACE__
15
21
34template <typename T, typename Sequence = deque<T>>
35class stack : public icollector<stack<T, Sequence>> {
36 static_assert(is_object_v<T>, "stack only contains object types.");
37 static_assert(is_same_v<T, typename Sequence::value_type>, "stack require consistent types.");
38
39public:
40 using value_type = typename Sequence::value_type;
41 using difference_type = typename Sequence::difference_type;
42 using size_type = typename Sequence::size_type;
43 using reference = typename Sequence::reference;
44 using const_reference = typename Sequence::const_reference;
45
46private:
47 Sequence seq_{};
48
49public:
50 stack() = default;
51 ~stack() = default;
52
53 stack(const stack&) = default;
54 stack& operator=(const stack&) = default;
55 stack(stack&&) noexcept(is_nothrow_move_constructible_v<Sequence>) = default;
56 stack& operator=(stack&&) noexcept(is_nothrow_move_assignable_v<Sequence>) = default;
57
62 explicit stack(const Sequence& seq) :
63 seq_(seq) {}
64
69 explicit stack(Sequence&& seq) noexcept(is_nothrow_move_constructible_v<Sequence>) :
70 seq_(_NEFORCE move(seq)) {}
71
76 NEFORCE_NODISCARD size_type size() const noexcept(noexcept(seq_.size())) { return seq_.size(); }
77
82 NEFORCE_NODISCARD bool empty() const noexcept(noexcept(seq_.empty())) { return seq_.empty(); }
83
88 NEFORCE_NODISCARD reference top() noexcept(noexcept(seq_.back())) { return seq_.back(); }
89
94 NEFORCE_NODISCARD const_reference top() const noexcept(noexcept(seq_.back())) { return seq_.back(); }
95
102 template <typename... Args>
103 decltype(auto) emplace(Args&&... args) {
104 return seq_.emplace_back(_NEFORCE forward<Args>(args)...);
105 }
106
113 void push(const value_type& value) { seq_.push_back(value); }
114
121 void push(value_type&& value) { seq_.push_back(_NEFORCE move(value)); }
122
128 void pop() noexcept(noexcept(seq_.pop_back())) { seq_.pop_back(); }
129
134 void swap(stack& other) noexcept(is_nothrow_swappable_v<Sequence>) { _NEFORCE swap(seq_, other.seq_); }
135
141 NEFORCE_NODISCARD bool equal_to(const stack& rhs) const noexcept(noexcept(seq_ == rhs.seq_)) {
142 return seq_ == rhs.seq_;
143 }
144
150 NEFORCE_NODISCARD bool less_than(const stack& rhs) const noexcept(noexcept(seq_ < rhs.seq_)) {
151 return seq_ < rhs.seq_;
152 }
153};
154
155#ifdef NEFORCE_STANDARD_17
156template <typename Sequence>
158#endif
159 // Container
161
162NEFORCE_END_NAMESPACE__
163#endif // NEFORCE_CORE_CONTAINER_STACK_HPP__
栈容器适配器
bool less_than(const stack &rhs) const noexcept(noexcept(seq_< rhs.seq_))
小于比较操作符
typename Sequence::reference reference
引用类型
reference top() noexcept(noexcept(seq_.back()))
访问栈顶元素
const_reference top() const noexcept(noexcept(seq_.back()))
常量访问栈顶元素
size_type size() const noexcept(noexcept(seq_.size()))
获取栈的大小
stack(Sequence &&seq) noexcept(is_nothrow_move_constructible_v< Sequence >)
移动构造函数,使用指定的底层容器
typename Sequence::const_reference const_reference
常量引用类型
void swap(stack &other) noexcept(is_nothrow_swappable_v< Sequence >)
交换两个栈的内容
typename Sequence::difference_type difference_type
差值类型
bool equal_to(const stack &rhs) const noexcept(noexcept(seq_==rhs.seq_))
相等比较操作符
void pop() noexcept(noexcept(seq_.pop_back()))
弹栈操作
typename Sequence::size_type size_type
大小类型
typename Sequence::value_type value_type
值类型
void push(value_type &&value)
压栈操作(移动版本)
decltype(auto) emplace(Args &&... args)
在栈顶就地构造元素
void push(const value_type &value)
压栈操作(拷贝版本)
bool empty() const noexcept(noexcept(seq_.empty()))
检查栈是否为空
双端队列容器
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
constexpr bool is_object_v
is_object的便捷变量模板
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
constexpr bool is_same_v
is_same的便捷变量模板
集合器接口模板