⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vector

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻
📖 第 1 页 / 共 2 页
字号:
                        }
                        for(size_type i = 0; i < n; i++){
                                data[i + index]  = x;
                        }
                }

                template <class InputIterator> _UCXXEXPORT
                        void _insert_from_iterator(iterator position, InputIterator first, InputIterator last)
                {
                        if (ispod && position==end()){
                          size_t sz=last-first;
                          reserve(size()+sz);
                          memcpy(end(),first,sz*sizeof(T));
                          elements+=sz;
                        }else{
                          while(first !=last){
                                  T temp = *first;
                                  position = insert(position, temp);
                                  ++position;
                                  ++first;
                          }
                        }
                }

                template <class InputIterator>
                        inline void _dispatch_insert(iterator position, InputIterator first, InputIterator last, __true_type)
                {
                        _insert_fill(position, first, last);
                }

                template <class InputIterator>
                        inline void _dispatch_insert(iterator position, InputIterator first, InputIterator last, __false_type)
                {
                                _insert_from_iterator(position, first, last);
                }

                inline void insert(iterator position, size_type n, const T& x ){
                        _insert_fill(position, n, x);
                }

                template <class InputIterator> inline void insert(iterator position, InputIterator first, InputIterator last){
                        typedef typename __is_integer<InputIterator>::value __some_type;
                        _dispatch_insert(position, first, last, __some_type());
                }

                _UCXXEXPORT iterator erase(iterator position){
                        size_type index = position - data;
                        if (ispod){
                          if (index<elements-1)
                            memmove(data+index,data+index+1,((elements-1)-index)*sizeof(T));
                        }
                        else
                          for(size_type i = index; i < (elements - 1); ++i){
                                  data[i] = data[i+1];
                          }
                        downsize(size() - 1);
                        return (data + index);
                }

                _UCXXEXPORT iterator erase(iterator first, iterator last){
                        size_type index = first - data;
                        size_type width = last - first;
                        if (ispod){
                          if (index<elements-width)
                            memmove(data+index,data+index+width,((elements-width)-index)*sizeof(T));
                        }
                        else
                          for(size_type i = index; i < (elements - width) ;++i){
                                  data[i] = data[i+width];
                          }
                        downsize(size() - width);
                        return (data + index);
                }

                _UCXXEXPORT void swap(vector<T,Allocator>& v){
                        if(this == &v){         //Avoid dv.swap(v)
                                return;
                        }
                        T* ptr;
                        size_type temp;

                        //Swap pointers first
                        ptr = data;
                        data = v.data;
                        v.data  = ptr;

                        //Swap element counts
                        temp = elements;
                        elements = v.elements;
                        v.elements = temp;

                        //Swap data size
                        temp = data_size;
                        data_size = v.data_size;
                        v.data_size = temp;
                }

                _UCXXEXPORT void clear(){
                        downsize(0);
                }

        protected:
                T* data;
                size_type data_size;
                size_type elements;
                Allocator a;
        };



        //Here go template instantiations

        template<class T, class Allocator> _UCXXEXPORT vector<T, Allocator>::~vector(){
                for(size_t i = 0; i < elements; ++i){
                        a.destroy(data + i);
                }
                a.deallocate(data, data_size);
        }


        template<class T, class Allocator> _UCXXEXPORT void vector<T, Allocator>::reserve(size_type n){
              if (!allocator_traits<Allocator>::is_static)
               {
                if(n > data_size){              //We never shrink...
                        T * temp_ptr = data;
                        size_type temp_size = data_size;

                        data_size = n+n/2;//__UCLIBCXX_STL_BUFFER_SIZE__;
                        data = a.allocate(data_size);

                        if (ispod)
                          memcpy(data,temp_ptr,elements*sizeof(T));
                        else
                          for(size_type i = 0; i<elements; ++i){
                                  a.construct(data+i, temp_ptr[i]);
                                  a.destroy(temp_ptr+i);
                          }
                        a.deallocate(temp_ptr, temp_size);
                }
               }
              else
                data_size = n;
        }

        template<class T, class Allocator> _UCXXEXPORT void vector<T, Allocator>::resize(size_type sz, const T & c){
                if(sz > elements){      //Need to actually call constructor
                        reserve(sz);

                        for(size_type i = elements; i<sz ; ++i){
                                a.construct(data+i, c);
                        }
                        elements = sz;
                }else{
                        downsize(sz);
                }
        }

        template<class T, class Allocator> _UCXXEXPORT void vector<T, Allocator>::downsize(size_type sz){
                if(sz < elements){      //Actually are downsizing
                        for(size_t i = sz; i< elements; ++i){
                                a.destroy(data+i);
                        }
                        elements = sz;
                }
        }


#ifndef __UCLIBCXX_COMPILE_VECTOR__
#ifdef __UCLIBCXX_EXPAND_VECTOR_BASIC__


#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
        template<> _UCXXEXPORT vector<char, allocator<char> >::vector(const allocator<char>& al);
        template<> _UCXXEXPORT vector<char, allocator<char> >::vector(size_type n, const char & value, const allocator<char> & al);

        template<> _UCXXEXPORT vector<char, allocator<char> >::~vector();
        template<> _UCXXEXPORT vector<unsigned char, allocator<unsigned char> >::~vector();

#endif //__UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__

        template<> _UCXXEXPORT void vector<char, allocator<char> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<unsigned char, allocator<unsigned char> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<short int, allocator<short int> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<unsigned short int, allocator<unsigned short int> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<int, allocator<int> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<unsigned int, allocator<unsigned int> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<long int, allocator<long int> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<unsigned long int, allocator<unsigned long int> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<float, allocator<float> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<double, allocator<double> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<bool, allocator<bool> >::reserve(size_type n);

        template<> _UCXXEXPORT void vector<char, allocator<char> >::resize(size_type sz, const char & c);
        template<> _UCXXEXPORT void
                vector<unsigned char, allocator<unsigned char> >::resize(size_type sz, const unsigned char & c);
        template<> _UCXXEXPORT void vector<short int, allocator<short int> >::resize(size_type sz, const short & c);
        template<> _UCXXEXPORT void
                vector<unsigned short int, allocator<unsigned short int> >::resize(size_type sz, const unsigned short int & c);
        template<> _UCXXEXPORT void vector<int, allocator<int> >::resize(size_type sz, const int & c);
        template<> _UCXXEXPORT void vector<unsigned int, allocator<unsigned int> >::resize(size_type sz, const unsigned int & c);
        template<> _UCXXEXPORT void vector<long int, allocator<long int> >::resize(size_type sz, const long int & c);
        template<> _UCXXEXPORT void
                vector<unsigned long int, allocator<unsigned long int> >::resize(size_type sz, const unsigned long int & c);
        template<> _UCXXEXPORT void vector<float, allocator<float> >::resize(size_type sz, const float & c);
        template<> _UCXXEXPORT void vector<double, allocator<double> >::resize(size_type sz, const double & c);
        template<> _UCXXEXPORT void vector<bool, allocator<bool> >::resize(size_type sz, const bool & c);

#elif defined __UCLIBCXX_EXPAND_STRING_CHAR__

#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__

        template<> _UCXXEXPORT vector<char, allocator<char> >::vector(const allocator<char>& al);
        template<> _UCXXEXPORT vector<char, allocator<char> >::vector(size_type n, const char & value, const allocator<char> & al);
        template<> _UCXXEXPORT vector<char, allocator<char> >::~vector();

#endif

        template<> _UCXXEXPORT void vector<char, allocator<char> >::reserve(size_type n);
        template<> _UCXXEXPORT void vector<char, allocator<char> >::resize(size_type sz, const char & c);

#endif
#endif



        template <class T, class Allocator> _UCXXEXPORT bool
                operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
        {
                if(x.size() !=y.size() ){
                        return false;
                }
                for(size_t i = 0; i < x.size(); ++i){
                        if(x[i] != y[i]){
                                return false;
                        }
                }
                return true;
        }

        template <class T, class Allocator> _UCXXEXPORT bool
                operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
        {
                less<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
                return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
        }
        template <class T, class Allocator> _UCXXEXPORT bool
                operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
        {
                return !(x == y);
        }
        template <class T, class Allocator> _UCXXEXPORT bool
                operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y)
        {
                greater<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
                return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
        }
        template <class T, class Allocator> _UCXXEXPORT bool
                operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
        {
                greater_equal<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
                return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
        }
        template <class T, class Allocator> _UCXXEXPORT bool
                operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y)
        {
                less_equal<typename iterator_traits<typename vector<T,Allocator>::iterator >::value_type> c;
                return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), c);
        }

        template <class T, class Allocator> _UCXXEXPORT void swap(vector<T,Allocator>& x, vector<T,Allocator>& y){
                x.swap(y);
        }

}

#pragma warning(pop)

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -