📄 array.h
字号:
return storage[offset(v)];}template<typename T,typename A>template<typename Vector_position>typename Array_2D<T,A>::const_referenceArray_2D<T,A>::operator[](const Vector_position& v) const{ return storage[offset(v)]; }template<typename T,typename A> typename Array_2D<T,A>::referenceArray_2D<T,A>::operator()(const size_type x,const size_type y){ return storage[offset(x,y)]; }template<typename T,typename A> typename Array_2D<T,A>::const_referenceArray_2D<T,A>::operator()(const size_type x,const size_type y) const{ return storage[offset(x,y)]; }template<typename T,typename A>template<typename Vector_position>typename Array_2D<T,A>::referenceArray_2D<T,A>::at(const Vector_position& v){ if ((v[0]>=x_dim)||(v[1]>=y_dim)){#ifdef ARRAY_EXCEPTION if (v[0]>=x_dim) { throw std::out_of_range("Out of range X"); } else{ throw std::out_of_range("Out of range Y"); }#else std::cerr<<"[Array_2D<T,A>::at] Out of range"<<std::endl; exit(1);#endif } return storage[offset(v)];}template<typename T,typename A>template<typename Vector_position>typename Array_2D<T,A>::const_referenceArray_2D<T,A>::at(const Vector_position& v) const{ if ((v[0]>=x_dim)||(v[1]>=y_dim)){#ifdef ARRAY_EXCEPTION if (v[0]>=x_dim) { throw std::out_of_range("Out of range X"); } else{ throw std::out_of_range("Out of range Y"); }#else std::cerr<<"[Array_2D<T,A>::at] Out of range"<<std::endl; exit(1);#endif } return storage[offset(v)];}template<typename T,typename A> typename Array_2D<T,A>::referenceArray_2D<T,A>::at(const size_type x,const size_type y){ if ((x>=x_dim)||(y>=y_dim)){#ifdef ARRAY_EXCEPTION if (x>=x_dim) { throw std::out_of_range("Out of range X"); } else{ throw std::out_of_range("Out of range Y"); }#else std::cerr<<"[Array_2D<T,A>::at] Out of range"<<std::endl; exit(1);#endif } return storage[offset(x,y)]; }template<typename T,typename A> typename Array_2D<T,A>::const_referenceArray_2D<T,A>::at(const size_type x,const size_type y) const{ if ((x>=x_dim)||(y>=y_dim)){#ifdef ARRAY_EXCEPTION if (x>=x_dim) { throw std::out_of_range("Out of range X"); } else{ throw std::out_of_range("Out of range Y"); }#else std::cerr<<"[Array_2D<T,A>::at] Out of range"<<std::endl; exit(1);#endif } return storage[offset(x,y)]; } template<typename T,typename A> typename Array_2D<T,A>::iteratorArray_2D<T,A>::begin(){ return storage.begin();}template<typename T,typename A> typename Array_2D<T,A>::const_iteratorArray_2D<T,A>::begin() const{ return storage.begin();}template<typename T,typename A> typename Array_2D<T,A>::iteratorArray_2D<T,A>::end(){ return storage.end();}template<typename T,typename A> typename Array_2D<T,A>::const_iteratorArray_2D<T,A>::end() const{ return storage.end();}template<typename T,typename A> typename Array_2D<T,A>::reverse_iteratorArray_2D<T,A>::rbegin(){ return storage.rbegin();}template<typename T,typename A> typename Array_2D<T,A>::const_reverse_iteratorArray_2D<T,A>::rbegin() const{ return storage.rbegin();}template<typename T,typename A> typename Array_2D<T,A>::reverse_iteratorArray_2D<T,A>::rend(){ return storage.rend();}template<typename T,typename A> typename Array_2D<T,A>::const_reverse_iteratorArray_2D<T,A>::rend() const{ return storage.rend();}template<typename T,typename A> template<typename Vector_position>typename Array_2D<T,A>::size_typeArray_2D<T,A>::offset(const Vector_position& v) const{#ifdef CHECK_ARRAY_ACCESS if ((v[0] >= x_dim) || (v[1] >= y_dim)){ std::cerr<<"Array_2D: Out of range ("<<v[0]<<","<<v[1]<<"), actual size is "<<x_dim<<"x"<<y_dim<<std::endl; } exit(1);#endif return v[0]*y_dim + v[1];}template<typename T,typename A> typename Array_2D<T,A>::size_typeArray_2D<T,A>::offset(const size_type& x,const size_type& y) const{ #ifdef CHECK_ARRAY_ACCESS if ((x >= x_dim) || (y >= y_dim)){ std::cerr<<"Array_2D: Out of range ("<<x<<","<<y<<"), actual size is "<<x_dim<<"x"<<y_dim<<std::endl; } exit(1);#endif return x*y_dim + y;}#ifndef NO_XMLtemplate<typename T,typename A> QDomElement Array_2D<T,A>::to_DOM_element(const QString& name, QDomDocument& document) const{ QDomElement main_element = document.createElement(name); main_element.setAttribute("width",QString::number(width())); main_element.setAttribute("height",QString::number(height())); std::ostringstream out; for(const_iterator i=begin(),i_end=end();i!=i_end;i++){ out<<(*i)<<' '; } main_element.appendChild(document.createTextNode(out.str())); return main_element;}template<typename T,typename A> void Array_2D<T,A>::from_DOM_element(const QDomElement& element){ QDomElement& elt = const_cast<QDomElement&>(element); const size_type width = elt.attributeNode("width").value().toUInt(); const size_type height = elt.attributeNode("height").value().toUInt(); resize(width,height); std::istringstream in(elt.text()); for(iterator i=begin(),i_end=end();i!=i_end;i++){ in>>(*i); }}#endif/* ################## # class Array_3D # ################## */template<typename T,typename A>Array_3D<T,A>::Array_3D(const A& a) :x_dim(0),y_dim(0),z_dim(0),storage(){}template<typename T,typename A>Array_3D<T,A>::Array_3D(const size_type nx, const size_type ny, const size_type nz, const T& val, const A& a) :x_dim(nx),y_dim(ny),z_dim(nz),storage(nx*ny*nz,val,a){}/*! Fills in the array with the elements between \p begin_elt and \p \e end_elt. Throw the length_error() exception if not enough elements. */template<typename T,typename A>template<typename Element_iterator>Array_3D<T,A>::Array_3D(Element_iterator begin_elt, Element_iterator end_elt, const size_type nx, const size_type ny, const size_type nz, const A& a) :x_dim(nx),y_dim(ny),z_dim(nz),storage(a){ const size_type s = x_dim*y_dim*z_dim; storage.reserve(s); Element_iterator elt; size_type index; for(elt=begin_elt,index=0;(elt!=end_elt)&&(index<s);elt++,index++){ storage.push_back(*elt); } if (index!=s) { storage.clear(); storage.reserve(0);#ifdef ARRAY_EXCEPTION throw std::length_error("Not enough elements to initialize the array");#else std::cerr<<"[Array_3D<T,A>::Array_3D] Not enough elements to initialize the array"<<std::endl; exit(1);#endif }}template<typename T,typename A>Array_3D<T,A>::Array_3D(const Array_3D<T,A>& a) :x_dim(a.x_dim),y_dim(a.y_dim),z_dim(a.z_dim),storage(a.storage){}template<typename T,typename A>voidArray_3D<T,A>::assign(const size_type nx, const size_type ny, const size_type nz, const T& val){ x_dim = nx; y_dim = ny; z_dim = nz; storage.assign(x_dim*y_dim*z_dim,val);;}template<typename T,typename A>boolArray_3D<T,A>::empty() const{ return storage.empty();}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::x_size() const{ return x_dim;}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::width() const{ return x_dim;}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::y_size() const{ return y_dim;}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::height() const{ return y_dim;}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::z_size() const{ return z_dim;}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::depth() const{ return z_dim;}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::size() const{ return storage.size();}template<typename T,typename A>typename Array_3D<T,A>::size_typeArray_3D<T,A>::max_size() const{ return storage.max_size();}template<typename T,typename A> voidArray_3D<T,A>::resize(const size_type nx, const size_type ny, const size_type nz){ x_dim = nx; y_dim = ny; z_dim = nz; storage.resize(x_dim * y_dim * z_dim);}template<typename T,typename A> voidArray_3D<T,A>::swap(Array_3D<T,A>& a){ size_type x_buf = x_dim; size_type y_buf = y_dim; size_type z_buf = z_dim; x_dim = a.x_dim; y_dim = a.y_dim; z_dim = a.z_dim; a.x_dim = x_buf; a.y_dim = y_buf; a.z_dim = z_buf; storage.swap(a.storage);}template<typename T,typename A> typename Array_3D<T,A>::allocator_typeArray_3D<T,A>::get_allocator() const{ return storage.get_allocator();} template<typename T,typename A> Array_3D<T,A>&Array_3D<T,A>::operator=(const Array_3D<T,A>& a){ if (&a!=this){ x_dim = a.x_dim; y_dim = a.y_dim; z_dim = a.z_dim; storage = a.storage; } return *this;}template<typename T,typename A> boolArray_3D<T,A>::operator==(const Array_3D<T,A>& a){ return ((x_dim==a.x_dim) &&(y_dim==a.y_dim) &&(z_dim==a.z_dim) &&(storage==a.storage));}template<typename T,typename A> boolArray_3D<T,A>::operator!=(const Array_3D<T,A>& a){ return !(*this==a);}template<typename T,typename A> template<typename Vector_position>typename Array_3D<T,A>::referenceArray_3D<T,A>::operator[](const Vector_position& v){ return storage[offset(v)];}template<typename T,typename A> template<typename Vector_position>typename Array_3D<T,A>::const_referenceArray_3D<T,A>::operator[](const Vector_position& v) const{ return storage[offset(v)]; }template<typename T,typename A> typename Array_3D<T,A>::referenceArray_3D<T,A>::operator()(const size_type x, const size_type y, const size_type z){ return storage[offset(x,y,z)]; }template<typename T,typename A> typename Array_3D<T,A>::const_referenceArray_3D<T,A>::operator()(const size_type x, const size_type y, const size_type z) const{ return storage[offset(x,y,z)]; }template<typename T,typename A> template<typename Vector_position>typename Array_3D<T,A>::referenceArray_3D<T,A>::at(const Vector_position& v){ if ((v[0]>=x_dim)||(v[1]>=y_dim)||(v[2]>=z_dim)){#ifdef ARRAY_EXCEPTION if (v[0]>=x_dim) { throw std::out_of_range("Out of range X"); } else if (v[1]>=y_dim) { throw std::out_of_range("Out of range Y"); } else { throw std::out_of_range("Out of range Z"); }#else std::cerr<<"[Array_3D<T,A>::at] Out of range"<<std::endl; exit(1);#endif } return storage[offset(v)];}template<typename T,typename A> template<typename Vector_position>typename Array_3D<T,A>::const_referenceArray_3D<T,A>::at(const Vector_position& v) const{ if ((v[0]>=x_dim)||(v[1]>=y_dim)||(v[2]>=z_dim)){#ifdef ARRAY_EXCEPTION if (v[0]>=x_dim) { throw std::out_of_range("Out of range X"); } else if (v[1]>=y_dim) { throw std::out_of_range("Out of range Y"); } else { throw std::out_of_range("Out of range Z"); }#else std::cerr<<"[Array_3D<T,A>::at] Out of range"<<std::endl; exit(1);#endif } return storage[offset(v)];}template<typename T,typename A> typename Array_3D<T,A>::referenceArray_3D<T,A>::at(const size_type x, const size_type y, const size_type z){ if ((x>=x_dim)||(y>=y_dim)||(z>=z_dim)){#ifdef ARRAY_EXCEPTION if (x>=x_dim) { throw std::out_of_range("Out of range X"); } else if (y>=y_dim) { throw std::out_of_range("Out of range Y"); } else { throw std::out_of_range("Out of range Z"); }#else std::cerr<<"[Array_3D<T,A>::at] Out of range"<<std::endl;#endif } return storage[offset(x,y,z)]; }template<typename T,typename A> typename Array_3D<T,A>::const_referenceArray_3D<T,A>::at(const size_type x, const size_type y, const size_type z) const{ if ((x>=x_dim)||(y>=y_dim)||(z>=z_dim)){#ifdef ARRAY_EXCEPTION if (x>=x_dim) { throw std::out_of_range("Out of range X"); } else if (y>=y_dim) { throw std::out_of_range("Out of range Y"); } else { throw std::out_of_range("Out of range Z"); }#else std::cerr<<"[Array_3D<T,A>::at] Out of range"<<std::endl;#endif } return storage[offset(x,y,z)]; } template<typename T,typename A> typename Array_3D<T,A>::iteratorArray_3D<T,A>::begin(){ return storage.begin();}template<typename T,typename A> typename Array_3D<T,A>::const_iteratorArray_3D<T,A>::begin() const{ return storage.begin();}template<typename T,typename A> typename Array_3D<T,A>::iteratorArray_3D<T,A>::end(){ return storage.end();}template<typename T,typename A> typename Array_3D<T,A>::const_iteratorArray_3D<T,A>::end() const{ return storage.end();}template<typename T,typename A> typename Array_3D<T,A>::reverse_iteratorArray_3D<T,A>::rbegin(){ return storage.rbegin();}template<typename T,typename A> typename Array_3D<T,A>::const_reverse_iteratorArray_3D<T,A>::rbegin() const{ return storage.rbegin();}template<typename T,typename A> typename Array_3D<T,A>::reverse_iteratorArray_3D<T,A>::rend(){ return storage.rend();}template<typename T,typename A> typename Array_3D<T,A>::const_reverse_iteratorArray_3D<T,A>::rend() const{ return storage.rend();}template<typename T,typename A> template<typename Vector_position>typename Array_3D<T,A>::size_typeArray_3D<T,A>::offset(const Vector_position& v) const{#ifdef CHECK_ARRAY_ACCESS if ((v[0] >= x_dim) || (v[1] >= y_dim) || (v[2] >= z_dim)){ std::cerr<<"Array_3D: Out of range ("<<v[0]<<","<<v[1]<<","<<v[2]<<"), actual size is "<<x_dim<<"x"<<y_dim<<"x"<<z_dim<<std::endl; }#endif return (v[0]*y_dim + v[1])*z_dim + v[2];}template<typename T,typename A> typename Array_3D<T,A>::size_typeArray_3D<T,A>::offset(const size_type& x, const size_type& y, const size_type& z) const{#ifdef CHECK_ARRAY_ACCESS if ((x >= x_dim) || (y >= y_dim) || (z >= z_dim)){ std::cerr<<"Array_3D: Out of range ("<<x<<","<<y<<","<<z<<"), actual size is "<<x_dim<<"x"<<y_dim<<"x"<<z_dim<<std::endl; }#endif return (x*y_dim + y)*z_dim + z;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -