vector_of_vector.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 1,213 行 · 第 1/4 页
HPP
1,213 行
//// Copyright (c) 2003// Gunter Winkler, Joerg Walter//// Permission to use, copy, modify, distribute and sell this software// and its documentation for any purpose is hereby granted without fee,// provided that the above copyright notice appear in all copies and// that both that copyright notice and this permission notice appear// in supporting documentation. The authors make no representations// about the suitability of this software for any purpose.// It is provided "as is" without express or implied warranty.//// The authors gratefully acknowledge the support of// GeNeSys mbH & Co. KG in producing this work.//#ifndef BOOST_UBLAS_ENABLE_EXPERIMENTAL#error class generalized_vector_of_vector is experiment and currently does not work#endif#ifndef BOOST_UBLAS_VECTOR_OF_VECTOR_H#define BOOST_UBLAS_VECTOR_OF_VECTOR_H#include <boost/numeric/ublas/config.hpp>#include <boost/numeric/ublas/storage_sparse.hpp>#include <boost/numeric/ublas/matrix_sparse.hpp>// Iterators based on ideas of Jeremy Sieknamespace boost { namespace numeric { namespace ublas { // Array based sparse matrix class template<class T, class F, class A> class generalized_vector_of_vector: public matrix_expression<generalized_vector_of_vector<T, F, A> > { public:#ifndef BOOST_UBLAS_NO_PROXY_SHORTCUTS BOOST_UBLAS_USING matrix_expression<generalized_vector_of_vector<T, F, A> >::operator ();#endif typedef typename A::size_type size_type; typedef typename A::difference_type difference_type; typedef T value_type; typedef const T &const_reference;#ifndef BOOST_UBLAS_STRICT_VECTOR_SPARSE typedef T &reference;#else typedef sparse_vector_element<typename A::value_type> reference;#endif typedef A array_type; private: typedef T *pointer; typedef F functor_type; typedef generalized_vector_of_vector<T, F, A> self_type; public:#ifndef BOOST_UBLAS_CT_REFERENCE_BASE_TYPEDEFS typedef const matrix_const_reference<const self_type> const_closure_type;#else typedef const matrix_reference<const self_type> const_closure_type;#endif typedef matrix_reference<self_type> closure_type; typedef typename A::value_type vector_data_value_type; typedef sparse_tag storage_category; typedef typename F::orientation_category orientation_category; // Construction and destruction BOOST_UBLAS_INLINE generalized_vector_of_vector (): size1_ (0), size2_ (0), non_zeros_ (0), data_ (1) { for (size_type i = 0; i < functor_type::size1 (size1_, size2_); ++ i) static_cast<vector_data_value_type &> (data_ [i]).resize (functor_type::size2 (size1_, size2_)); data_ [functor_type::size1 (size1_, size2_)] = vector_data_value_type (); } BOOST_UBLAS_INLINE generalized_vector_of_vector (size_type size1, size_type size2, size_type non_zeros = 0): size1_ (size1), size2_ (size2), non_zeros_ (non_zeros), data_ (functor_type::size1 (size1_, size2_) + 1) { for (size_type i = 0; i < functor_type::size1 (size1_, size2_); ++ i) static_cast<vector_data_value_type &> (data_ [i]).resize (functor_type::size2 (size1_, size2_)); data_ [functor_type::size1 (size1_, size2_)] = vector_data_value_type (); } BOOST_UBLAS_INLINE generalized_vector_of_vector (const generalized_vector_of_vector &m): size1_ (m.size1_), size2_ (m.size2_), non_zeros_ (m.non_zeros_), data_ (m.data_) {} template<class AE> BOOST_UBLAS_INLINE generalized_vector_of_vector (const matrix_expression<AE> &ae, size_type non_zeros = 0): size1_ (ae ().size1 ()), size2_ (ae ().size2 ()), non_zeros_ (non_zeros), data_ (functor_type::size1 (size1_, size2_) + 1) { for (size_type i = 0; i < functor_type::size1 (size1_, size2_); ++ i) static_cast<vector_data_value_type &> (data_ [i]).resize (functor_type::size2 (size1_, size2_)); data_ [functor_type::size1 (size1_, size2_)] = vector_data_value_type (); matrix_assign (scalar_assign<reference, BOOST_UBLAS_TYPENAME AE::value_type> (), *this, ae); } // Accessors BOOST_UBLAS_INLINE size_type size1 () const { return size1_; } BOOST_UBLAS_INLINE size_type size2 () const { return size2_; } BOOST_UBLAS_INLINE size_type non_zeros () const { size_type non_zeros = 0; for (vector_const_iterator_type itv = data_ ().begin (); itv != data_ ().end (); ++ itv) non_zeros += (*itv).size (); return non_zeros; } BOOST_UBLAS_INLINE const array_type &data () const { return data_; } BOOST_UBLAS_INLINE array_type &data () { return data_; } // Resizing BOOST_UBLAS_INLINE void resize (size_type size1, size_type size2, size_type non_zeros = 0) { size1_ = size1; size2_ = size2; non_zeros_ = non_zeros; data ().resize (functor_type::size1 (size1_, size2_) + 1); for (size_type i = 0; i < functor_type::size1 (size1_, size2_); ++ i) static_cast<vector_data_value_type &> (data_ [i]).resize (functor_type::size2 (size1_, size2_)); data () [functor_type::size1 (size1_, size2_)] = vector_data_value_type (); } // Proxy support#ifdef BOOST_UBLAS_STRICT_VECTOR_SPARSE pointer find_element (size_type i, size_type j) { vector_iterator_type itv (data ().find (functor_type::element1 (i, size1_, j, size2_))); if (itv == data ().end () || itv.index () != functor_type::element1 (i, size1_, j, size2_)) return 0; iterator_type it (static_cast<vector_data_value_type &> (*itv).find (functor_type::element2 (i, size1_, j, size2_))); if (it == static_cast<vector_data_value_type &> (*itv).end () || it.index () != functor_type::element2 (i, size1_, j, size2_)) return 0; return &static_cast<value_type &> (*it); }#endif // Element access BOOST_UBLAS_INLINE const_reference at_element (size_type i, size_type j) const { vector_const_iterator_type itv (data ().find (functor_type::element1 (i, size1_, j, size2_))); if (itv == data ().end () || itv.index () != functor_type::element1 (i, size1_, j, size2_)) return zero_; const_iterator_type it (static_cast<const vector_data_value_type &> (*itv).find (functor_type::element2 (i, size1_, j, size2_))); if (it == static_cast<const vector_data_value_type &> (*itv).end () || it.index () != functor_type::element2 (i, size1_, j, size2_)) return zero_; return static_cast<const value_type &> (*it); BOOST_UBLAS_INLINE true_reference at_element (size_type i, size_type j) { return data () [functor_type::element1 (i, size1_, j, size2_)] [functor_type::element2 (i, size1_, j, size2_)]; } BOOST_UBLAS_INLINE const_reference operator () (size_type i, size_type j) const { return at_element (i, j); } BOOST_UBLAS_INLINE reference operator () (size_type i, size_type j) {#ifndef BOOST_UBLAS_STRICT_MATRIX_SPARSE return at_element (i, j);#else return reference (this->data () [functor_type::element1 (i, size1_, j, size2_)], functor_type::element2 (i, size1_, j, size2_));#endif } // Assignment BOOST_UBLAS_INLINE generalized_vector_of_vector &operator = (const generalized_vector_of_vector &m) { if (this != &m) { size1_ = m.size1_; size2_ = m.size2_; non_zeros_ = m.non_zeros_; data () = m.data (); } return *this; } BOOST_UBLAS_INLINE generalized_vector_of_vector &assign_temporary (generalized_vector_of_vector &m) { swap (m); return *this; } template<class AE> BOOST_UBLAS_INLINE generalized_vector_of_vector &operator = (const matrix_expression<AE> &ae) { // return assign (self_type (ae, non_zeros_)); self_type temporary (ae, non_zeros_); return assign_temporary (temporary); } template<class AE> BOOST_UBLAS_INLINE generalized_vector_of_vector &assign (const matrix_expression<AE> &ae) { matrix_assign (scalar_assign<reference, BOOST_UBLAS_TYPENAME AE::value_type> (), *this, ae); return *this; } template<class AE> BOOST_UBLAS_INLINE generalized_vector_of_vector& operator += (const matrix_expression<AE> &ae) { // return assign (self_type (*this + ae, non_zeros_)); self_type temporary (*this + ae, non_zeros_); return assign_temporary (temporary); } template<class AE> BOOST_UBLAS_INLINE generalized_vector_of_vector &plus_assign (const matrix_expression<AE> &ae) { matrix_assign (scalar_plus_assign<reference, BOOST_UBLAS_TYPENAME AE::value_type> (), *this, ae); return *this; } template<class AE> BOOST_UBLAS_INLINE generalized_vector_of_vector& operator -= (const matrix_expression<AE> &ae) { // return assign (self_type (*this - ae, non_zeros_)); self_type temporary (*this - ae, non_zeros_); return assign_temporary (temporary); } template<class AE> BOOST_UBLAS_INLINE generalized_vector_of_vector &minus_assign (const matrix_expression<AE> &ae) { matrix_assign (scalar_minus_assign<reference, BOOST_UBLAS_TYPENAME AE::value_type> (), *this, ae); return *this; } template<class AT> BOOST_UBLAS_INLINE generalized_vector_of_vector& operator *= (const AT &at) { matrix_assign_scalar (scalar_multiplies_assign<reference, AT> (), *this, at); return *this; } template<class AT> BOOST_UBLAS_INLINE generalized_vector_of_vector& operator /= (const AT &at) { matrix_assign_scalar (scalar_divides_assign<reference, AT> (), *this, at); return *this; } // Swapping BOOST_UBLAS_INLINE void swap (generalized_vector_of_vector &m) { if (this != &m) { std::swap (size1_, m.size1_); std::swap (size2_, m.size2_); std::swap (non_zeros_, m.non_zeros_); data ().swap (m.data ()); } }#ifndef BOOST_UBLAS_NO_MEMBER_FRIENDS BOOST_UBLAS_INLINE friend void swap (generalized_vector_of_vector &m1, generalized_vector_of_vector &m2) { m1.swap (m2); }#endif // Sorting void sort () { vector_iterator_type itv (data ().begin ()); vector_iterator_type itv_end (data ().end ()); while (itv != itv_end) { (*itv).sort (); ++ itv; } } // Element insertion and erasure BOOST_UBLAS_INLINE void insert (size_type i, size_type j, const_reference t) { vector_iterator_type itv (data ().find (functor_type::element1 (i, size1_, j, size2_))); if (itv == data ().end ()) { data ().insert (functor_type::element1 (i, size1_, j, size2_), vector_data_value_type (functor_type::size2 (size1_, size2_))); itv = data ().find (functor_type::element1 (i, size1_, j, size2_)); } // FIXME: should be allowed for coordinate_vector. // BOOST_UBLAS_CHECK (static_cast<vector_data_value_type &> (*itv).find (functor_type::element2 (i, size1_, j, size2_)) == static_cast<vector_data_value_type &> (*itv).end (), bad_index ()); static_cast<vector_data_value_type &> (*itv).insert (functor_type::element2 (i, size1_, j, size2_), t); } BOOST_UBLAS_INLINE void erase (size_type i, size_type j) { vector_iterator_type itv (data ().find (functor_type::element1 (i, size1_, j, size2_))); if (itv == data ().end ()) return; static_cast<vector_data_value_type &> (*itv).erase (functor_type::element2 (i, size1_, j, size2_)); } BOOST_UBLAS_INLINE void clear () { data ().resize (functor_type::size1 (size1_, size2_) + 1); for (size_type i = 0; i < functor_type::size1 (size1_, size2_); ++ i) static_cast<vector_data_value_type &> (data_ [i]).resize (functor_type::size2 (size1_, size2_)); data_ [functor_type::size1 (size1_, size2_)] = vector_data_value_type (); } // Iterator types private: // Use vector iterator typedef typename A::const_iterator vector_const_iterator_type; typedef typename A::iterator vector_iterator_type; typedef typename A::value_type::const_iterator const_iterator_type; typedef typename A::value_type::iterator iterator_type; public: class const_iterator1; class iterator1; class const_iterator2; class iterator2;#ifdef BOOST_MSVC_STD_ITERATOR
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?