📄 vector.hpp
字号:
} // Assignment BOOST_UBLAS_INLINE iterator &operator = (const iterator &it) { container_reference<self_type>::assign (&it ()); it_ = it.it_; return *this; } // Comparison BOOST_UBLAS_INLINE bool operator == (const iterator &it) const { BOOST_UBLAS_CHECK (&(*this) () == &it (), external_logic ()); return it_ == it.it_; } BOOST_UBLAS_INLINE bool operator < (const iterator &it) const { BOOST_UBLAS_CHECK (&(*this) () == &it (), external_logic ()); return it_ < it.it_; } private: iterator_type it_; friend class const_iterator; };#endif BOOST_UBLAS_INLINE iterator begin () { return find (0); } BOOST_UBLAS_INLINE iterator end () { return find (data_.size ()); } // Reverse iterator#ifdef BOOST_MSVC_STD_ITERATOR typedef reverse_iterator_base<const_iterator, value_type, const_reference> const_reverse_iterator;#else typedef reverse_iterator_base<const_iterator> const_reverse_iterator;#endif BOOST_UBLAS_INLINE const_reverse_iterator rbegin () const { return const_reverse_iterator (end ()); } BOOST_UBLAS_INLINE const_reverse_iterator rend () const { return const_reverse_iterator (begin ()); }#ifdef BOOST_MSVC_STD_ITERATOR typedef reverse_iterator_base<iterator, value_type, reference> reverse_iterator;#else typedef reverse_iterator_base<iterator> reverse_iterator;#endif BOOST_UBLAS_INLINE reverse_iterator rbegin () { return reverse_iterator (end ()); } BOOST_UBLAS_INLINE reverse_iterator rend () { return reverse_iterator (begin ()); } private: array_type data_; }; // Bounded vector class template<class T, std::size_t N> class bounded_vector: public vector<T, bounded_array<T, N> > { typedef vector<T, bounded_array<T, N> > vector_type; public: typedef typename vector_type::size_type size_type; BOOST_STATIC_CONSTANT (size_type, max_size = N); // Construction and destruction BOOST_UBLAS_INLINE bounded_vector (): vector_type (N) {} BOOST_UBLAS_INLINE bounded_vector (size_type size): vector_type (size) {} BOOST_UBLAS_INLINE bounded_vector (const bounded_vector &v): vector_type (v) {}#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template<class A2> // Allow vector<T,bounded_array<N> construction BOOST_UBLAS_INLINE bounded_vector (const vector<T, A2> &v): vector_type (v) {}#endif template<class AE> BOOST_UBLAS_INLINE bounded_vector (const vector_expression<AE> &ae): vector_type (ae) {} BOOST_UBLAS_INLINE ~bounded_vector () {} // Assignment BOOST_UBLAS_INLINE bounded_vector &operator = (const bounded_vector &v) { vector_type::operator = (v); return *this; } template<class A2> // Generic vector assignment BOOST_UBLAS_INLINE bounded_vector &operator = (const vector<T, A2> &v) { vector_type::operator = (v); return *this; } template<class AE> BOOST_UBLAS_INLINE bounded_vector &operator = (const vector_expression<AE> &ae) { vector_type::operator = (ae); return *this; } }; // Unit vector class template<class T> class unit_vector: public vector_expression<unit_vector<T> > { public:#ifndef BOOST_UBLAS_NO_PROXY_SHORTCUTS BOOST_UBLAS_USING vector_expression<unit_vector<T> >::operator ();#endif typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T value_type; typedef const T &const_reference; typedef T &reference; private: typedef const T *const_pointer; typedef unit_vector<T> self_type; public:#ifndef BOOST_UBLAS_CT_REFERENCE_BASE_TYPEDEFS typedef const vector_const_reference<const self_type> const_closure_type;#else typedef const vector_reference<const self_type> const_closure_type;#endif typedef vector_reference<self_type> closure_type; typedef packed_tag storage_category; // Construction and destruction BOOST_UBLAS_INLINE unit_vector (): vector_expression<self_type> (), size_ (0), index_ (0) {} BOOST_UBLAS_INLINE explicit unit_vector (size_type size, size_type index = 0): vector_expression<self_type> (), size_ (size), index_ (index) {} BOOST_UBLAS_INLINE unit_vector (const unit_vector &v): vector_expression<self_type> (), size_ (v.size_), index_ (v.index_) {} // Accessors BOOST_UBLAS_INLINE size_type size () const { return size_; } BOOST_UBLAS_INLINE size_type index () const { return index_; } // Resizing BOOST_UBLAS_INLINE void resize (size_type size, bool preserve = true) { size_ = size; } // Element access BOOST_UBLAS_INLINE const_reference operator () (size_type i) const { if (i == index_) return one_; else return zero_; } BOOST_UBLAS_INLINE const_reference operator [] (size_type i) const { return (*this) (i); } // Assignment BOOST_UBLAS_INLINE unit_vector &operator = (const unit_vector &v) { size_ = v.size_; index_ = v.index_; return *this; } BOOST_UBLAS_INLINE unit_vector &assign_temporary (unit_vector &v) { swap (v); return *this; } // Swapping BOOST_UBLAS_INLINE void swap (unit_vector &v) { if (this != &v) { std::swap (size_, v.size_); std::swap (index_, v.index_); } }#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS BOOST_UBLAS_INLINE friend void swap (unit_vector &v1, unit_vector &v2) { v1.swap (v2); }#endif // Iterator types private: // Use an index typedef size_type const_iterator_type; public:#ifdef BOOST_UBLAS_USE_INDEXED_ITERATOR typedef indexed_const_iterator<self_type, packed_random_access_iterator_tag> iterator; typedef indexed_const_iterator<self_type, packed_random_access_iterator_tag> const_iterator;#else class const_iterator;#endif // Element lookup BOOST_UBLAS_INLINE const_iterator find (size_type i) const { i = (std::max) (i, index_); i = (std::min) (i, index_ + 1); return const_iterator (*this, i); }#ifndef BOOST_UBLAS_USE_INDEXED_ITERATOR class const_iterator: public container_const_reference<unit_vector>, public random_access_iterator_base<packed_random_access_iterator_tag, const_iterator, value_type> { public: typedef packed_random_access_iterator_tag iterator_category;#ifdef BOOST_MSVC_STD_ITERATOR typedef const_reference reference;#else typedef typename unit_vector::difference_type difference_type; typedef typename unit_vector::value_type value_type; typedef typename unit_vector::const_reference reference; typedef typename unit_vector::const_pointer pointer;#endif // Construction and destruction BOOST_UBLAS_INLINE const_iterator (): container_const_reference<unit_vector> (), it_ () {} BOOST_UBLAS_INLINE const_iterator (const unit_vector &v, const const_iterator_type &it): container_const_reference<unit_vector> (v), it_ (it) {} // Arithmetic BOOST_UBLAS_INLINE const_iterator &operator ++ () { ++ it_; return *this; } BOOST_UBLAS_INLINE const_iterator &operator -- () { -- it_; return *this; } BOOST_UBLAS_INLINE const_iterator &operator += (difference_type n) { it_ += n; return *this; } BOOST_UBLAS_INLINE const_iterator &operator -= (difference_type n) { it_ -= n; return *this; } BOOST_UBLAS_INLINE difference_type operator - (const const_iterator &it) const { BOOST_UBLAS_CHECK (&(*this) () == &it (), external_logic ()); return it_ - it.it_; } // Dereference BOOST_UBLAS_INLINE const_reference operator * () const { BOOST_UBLAS_CHECK (it_ < (*this) ().size (), bad_index ()); return (*this) () (index ()); } // Index BOOST_UBLAS_INLINE size_type index () const { BOOST_UBLAS_CHECK (it_ < (*this) ().size (), bad_index ()); return it_; } // Assignment BOOST_UBLAS_INLINE const_iterator &operator = (const const_iterator &it) { container_const_reference<unit_vector>::assign (&it ()); it_ = it.it_; return *this; } // Comparison BOOST_UBLAS_INLINE bool operator == (const const_iterator &it) const { BOOST_UBLAS_CHECK (&(*this) () == &it (), external_logic ()); return it_ == it.it_; } BOOST_UBLAS_INLINE bool operator < (const const_iterator &it) const { BOOST_UBLAS_CHECK (&(*this) () == &it (), external_logic ()); return it_ < it.it_; } private: const_iterator_type it_; }; typedef const_iterator iterator;#endif BOOST_UBLAS_INLINE const_iterator begin () const { return find (0); } BOOST_UBLAS_INLINE const_iterator end () const { return find (size_); } // Reverse iterator#ifdef BOOST_MSVC_STD_ITERATOR typedef reverse_iterator_base<const_iterator, value_type, const_reference> const_reverse_iterator;#else typedef reverse_iterator_base<const_iterator> const_reverse_iterator;#endif BOOST_UBLAS_INLINE const_reverse_iterator rbegin () const { return const_reverse_iterator (end ()); } BOOST_UBLAS_INLINE const_reverse_iterator rend () const { return const_reverse_iterator (begin ()); } private: size_type size_; size_type index_; typedef const value_type const_value_type; static const_value_type zero_; static const_value_type one_; }; template<class T> typename unit_vector<T>::const_value_type unit_vector<T>::zero_ #ifdef BOOST_UBLAS_STATIC_OLD_INIT = BOOST_UBLAS_TYPENAME unit_vector<T>::const_value_type#endif (0); template<class T> typename unit_vector<T>::const_value_type unit_vector<T>::one_#ifdef BOOST_UBLAS_STATIC_OLD_INIT = BOOST_UBLAS_TYPENAME unit_vector<T>::const_value_type#endif (1); // Zero vector class template<class T> class zero_vector: public vector_expression<zero_vector<T> > { public:#ifndef BOOST_UBLAS_NO_PROXY_SHORTCUTS BOOST_UBLAS_USING vector_expression<zero_vector<T> >::operator ();#endif typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef T value_type; typedef const T &const_reference; typedef T &reference; private: typedef const T *const_pointer; typedef zero_vector<T> self_type; public:#ifndef BOOST_UBLAS_CT_REFERENCE_BASE_TYPEDEFS typedef const vector_const_reference<const self_type> const_closure_type;#else typedef const vector_reference<const self_type> const_closure_type;#endif typedef vector_reference<self_type> closure_type; typedef sparse_tag storage_category; // Construction and destruction BOOST_UBLAS_INLINE zero_vector (): vector_expression<self_type> (), size_ (0) {} explicit BOOST_UBLAS_INLINE zero_vector (size_type size): vector_expression<self_type> (), size_ (size) {} BOOST_UBLAS_INLINE zero_vector (const zero_vector &v): vector_expression<self_type> (), size_ (v.size_) {} // Accessors BOOST_UBLAS_INLINE size_type size () const { return size_; } // Resizing BOOST_UBLAS_INLINE void resize (size_type size, bool preserve = true) { size_ = size; } // Element access BOOST_UBLAS_INLINE const_reference operator () (size_type /* i */) const {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -