From 55fb870246416811c2e95fe0632c9aaa69c73947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Thu, 23 Oct 2014 09:58:47 +0800 Subject: [PATCH] bug fix && add two ctors --- TinySTL/Deque.h | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/TinySTL/Deque.h b/TinySTL/Deque.h index 1aa13b7..b6f3ada 100644 --- a/TinySTL/Deque.h +++ b/TinySTL/Deque.h @@ -139,6 +139,8 @@ namespace TinySTL{ } template typename dq_iter::difference_type operator - (const dq_iter& it1, const dq_iter& it2){ + if (it1.container_ == it2.container_ && it1.container_ == 0) + return 0; return typename dq_iter::difference_type(it1.getBuckSize()) * (it1.mapIndex_ - it2.mapIndex_ - 1) + (it1.cur_ - it1.getBuckHead(it1.mapIndex_)) + (it2.getBuckTail(it2.mapIndex_) - it2.cur_) + 1; } @@ -168,6 +170,9 @@ namespace TinySTL{ T **map_; public: deque(); + explicit deque(size_type n, const value_type& val = value_type()); + template + deque(InputIterator first, InputIterator last); deque(const deque& x); ~deque(){ @@ -240,6 +245,21 @@ namespace TinySTL{ bool front_full()const{ return map_[0] && map_[0] == begin().cur_; } + void deque_aux(size_t n, const value_type& val, std::true_type){ + int i = 0; + for (; i != n / 2; ++i) + (*this).push_front(val); + for (; i != n; ++i) + (*this).push_back(val); + } + template + void deque_aux(Iterator first, Iterator last, std::false_type){ + difference_type mid = (last - first) / 2; + for (auto it = first + mid; it >= first; --it) + (*this).push_front(*it); + for (auto it = first + mid + 1; it != last; ++it) + (*this).push_back(*it); + } void reallocateAndCopy(); public: template @@ -261,6 +281,17 @@ namespace TinySTL{ template deque::deque() :mapSize_(0), map_(0){} + template + deque::deque(size_type n, const value_type& val = value_type()){ + deque(); + deque_aux(n, val, typename std::is_integral::type()); + } + template + template + deque::deque(InputIterator first, InputIterator last){ + deque(); + deque_aux(first, last, typename std::is_integral::type()); + } /*template deque::deque(const deque& x){ @@ -309,7 +340,7 @@ namespace TinySTL{ template void deque::pop_front(){ dataAllocator::destroy(beg_.cur_); - --beg_; + ++beg_; } template void deque::pop_back(){ -- GitLab