diff --git a/TinySTL/Detail/Unordered_set.impl.h b/TinySTL/Detail/Unordered_set.impl.h index 1ba76e5..4e700f1 100644 --- a/TinySTL/Detail/Unordered_set.impl.h +++ b/TinySTL/Detail/Unordered_set.impl.h @@ -173,6 +173,70 @@ namespace TinySTL{ Unordered_set::end(){ return iterator(buckets_.size() - 1, buckets_[buckets_.size() - 1].end(), this); } + template + typename Unordered_set::local_iterator + Unordered_set::begin(size_type i){ + return buckets_[i].begin(); + } + template + typename Unordered_set::local_iterator + Unordered_set::end(size_type i){ + return buckets_[i].end(); + } + template + typename Unordered_set::iterator + Unordered_set::find(const key_type& key){ + auto index = bucket_index(key); + for (auto it = begin(index); it != end(index); ++it){ + if (key_equal()(key, *it)) + return iterator(index, it, this); + } + return end(); + } + template + typename Unordered_set::size_type + Unordered_set::count(const key_type& key){ + auto it = find(key); + return it == end() ? 0 : 1; + } + template + TinySTL::pair::iterator, bool> + Unordered_set::insert(const value_type& val){ + if (!has_key(val)){ + auto index = bucket_index(val); + buckets_[index].push_front(val); + ++size_; + return TinySTL::pair(iterator(index, buckets_[index].begin(), this), true); + } + return TinySTL::pair(end(), false); + } + template + template + void Unordered_set::insert(InputIterator first, InputIterator last){ + for (; first != last; ++first){ + insert(*first); + } + } + template + typename Unordered_set::iterator + Unordered_set::erase(iterator position){ + --size_; + auto t = position++; + auto index = t.bucket_index_; + auto it = buckets_[index].erase(t.iterator_); + return position; + } + template + typename Unordered_set::size_type + Unordered_set::erase(const key_type& key){ + auto it = find(key); + if (it == end()){ + return 0; + }else{ + erase(it); + return 1; + } + } } #endif \ No newline at end of file diff --git a/TinySTL/Unordered_set.h b/TinySTL/Unordered_set.h index 151b516..1a35418 100644 --- a/TinySTL/Unordered_set.h +++ b/TinySTL/Unordered_set.h @@ -14,6 +14,9 @@ namespace TinySTL{ template, class KeyEqual = TinySTL::equal_to, class Allocator = TinySTL::allocator < Key >> class ust_iterator{ + private: + template + friend class Unordered_set; private: typedef Unordered_set* cntrPtr; size_t bucket_index_; @@ -51,6 +54,7 @@ namespace TinySTL{ typedef Allocator allocator_type; typedef value_type& reference; typedef const value_type& const_reference; + typedef typename TinySTL::list::iterator local_iterator; typedef Detail::ust_iterator::iterator, Hash, KeyEqual, Allocator> iterator; private: TinySTL::vector> buckets_; @@ -73,6 +77,17 @@ namespace TinySTL{ iterator begin(); iterator end(); + local_iterator begin(size_type i); + local_iterator end(size_type i); + + iterator find(const key_type& key); + size_type count(const key_type& key); + + TinySTL::pair insert(const value_type& val); + template + void insert(InputIterator first, InputIterator last); + iterator erase(iterator position); + size_type erase(const key_type& key); haser hash_function()const; key_equal key_eq()const;