C++ learning-关于 error LNK2019以及error C2244的 解决方案

时间:2025-03-10 20:12:04
// #ifndef VECTOR_C_ #define VECTOR_C_ #include "" template <typename T> void Vector<T>::copyFrom(T const* A,Rank lo,Rank hi){ _elem=new T[_capacity=2*(hi-lo)]; _size=0; while(lo<hi) _elem[_size++] = A[lo++]; } template <typename T> Vector<T>& Vector<T>::operator=(Vector<T> const& V){ if (_elem) delete [] _elem; copyFrom(V._elem,0,()); return *this; } template <typename T>void Vector<T>::expand() { if (_size< _capacity) return; if (_capacity < DEFAULT_CAPACITY) _capacity=DEFAULT_CAPACITY; T* oldElem= _elem; _elem= new T[_capacity<<1]; for (int i=0;i<_size;i++) _elem[i]=oldElem[i]; delete [] oldElem; } template <typename T> void Vector<T>::shrink() { if (_capacity<DEFAULT_CAPACITY <<1) return; if (_size <<2 > _capacity) return; T* oleElem=_elem; _elem=new T[_capacity >>1]; for (int i=0;i<_size;i++) _elem[i]=oleElem[i]; delete [] oleElem; } template <typename T> T& Vector<T>::operator[] (Rank r) const { return _elem[r]; } template <typename T> void permute(Vector<T>& V) { for (int i=();i>0;i--) swap(V[i-1],V[rand() % i]); } template <typename T> void Vector<T>::unsort(Rank lo,Rank hi){ T* V=_elem+lo; for (Rank i=hi-lo;i>0;i--) swap(V[i-1],V[rand() % i]); } template <typename T> static bool lt(T* a,T* b){ return lt(*a,*b);} template <typename T> static bool lt(T& a,T& b){ return a<b;} template <typename T> static bool eq(T* a,T* b){ return eq(*a,*b);} template <typename T> static bool eq(T& a,T& b){ return a==b;} template <typename T> Rank Vector<T>::find(T const& e,Rank lo,Rank hi) const{ while ((lo<hi--) && (e!=_elem[hi])); //(0,n),首先执行lo<hi--,则hi=n-1,_elem[hi]正确;当hi=1时,执行完e!=_elem[0]后还是执行一次lo<hi--,则hi=lo-1! return hi; } template <typename T> Rank Vector<T>::insert (Rank r, T const& e){ expand(); for (int i=_size;i>r;i--) _elem[i]=_elem[i-1]; _elem[r]=e; _size++; return r; } template <typename T> int Vector<T>::remove(Rank lo,Rank hi){ if (lo==hi) return 0; while (hi<_size) _elem[lo++]=_elem[hi++]; _size=lo; shrink(); return hi-lo; } template <typename T> T Vector<T>::remove(Rank r){ T e=_elem[r]; remove(r,r+1); return e; } template <typename T> int Vector<T>::deduplicate(){ int oldsize=_size; Rank i=1; while (i<_size) (find(_elem[i],o,i))<0? i++ :remove(i); return oldsize-_size; } template <typename T> void Vector<T>::traverse (void (*visit) (T&)) { for (int i=0;i<_size;i++) visit(_elem[i]); } template <typename T> template <typename VST> void Vector<T>::traverse(VST &visit) { for (int i=0;i<_size;i++) visit(_elem[i]); } template <typename T> struct Increase { virtual void operator() (T& e){ e++; } }; template <typename T> void increase (Vector<T> &V) { (Increase<T>()); } template <typename T> int Vector<T>::disordered() const{ int n=0; for (int i=1;i<_size;i++) if (_elem[i-1]>_elem[i]) n++; return n; } //n=0有序 template <typename T> int Vector<T>::uniquify() { //有序向量重复元素剔除算法(高效版) Rank i=0,j=0; while(++j<_size) if (_elem[i]!=_elem[j]) { _elem[++i]=_elem[j]; } _size=++i; shrink(); return j-i; } //有序查找为search() //template <typename T> static Rank binSearch(T *A,T const& e,Rank lo,Rank hi){ //版本A // while (lo<hi){ // Rank mi=(lo+hi)>>1; // if (e<A[mi]) // hi=mi; // else if (e>A[mi]) // lo=mi; // else // return mi; // } // return -1; //} //template <typename T> static Rank binSearch(T* A,T cosnt& e,Rank lo,Rank hi){ //版本B // while (1<hi-lo){ // Rank mi=(lo+hi)>>1; // (e<A[mi])?hi=mi:lo=mi; // } // return (e==A[lo])?lo:-1; //} template <typename T> static Rank binSearch(T* A,T const& e,Rank lo,Rank hi){ //版本C,返回小于等于e的秩最大者 while (lo<hi){ Rank mi=(lo+hi)>>1; (e<A[mi])?hi=mi:lo=mi+1; } return --lo; } #include "" //自己编写 template <typename T> static Rank fibSearch(T* A,T const& e,Rank lo,Rank hi){ Fib fib(hi-lo); while (lo<hi){ while (hi-lo<()) (); Rank mi=lo+()-1; if (e<A[mi]) hi=mi; else if (e>A[mi]) lo=mi; else return mi; } return -1; } template <typename T> Rank Vector<T>::search(T const& e,Rank lo,Rank hi) const{ return (rand() % 2)? binSearch(_elem,e,lo,hi):fibSearch(_elem,e,lo,hi); } template <typename T> void Vector<T>::sort (Rank lo,Rank hi){ switch (rand()%5) { case 1: case 2:bubbleSort(lo,hi);break; case 3: case 4:mergeSort(lo,hi);break; default: mergeSort(lo,hi);break; break; } } template<typename T> bool Vector<T>::bubble(Rank lo,Rank hi){ bool sorted=true; while(++lo<hi) { if (_elem[lo-1]>_elem[lo]){ sorted=false; swap(_elem[lo-1],_elem[lo]); } } return sorted; } template <typename T> void Vector<T>::bubbleSort(Rank lo,Rank hi) { while(!bubble(lo,hi--)) ; } template<typename T> void Vector<T>::merge(Rank lo,Rank mi,Rank hi){ T* A=_elem+lo; int lb=mi-lo; T *B=new T[lb]; for (Rank i=0;i<lb;B[i]=A[i++]); int lc=hi-mi; T* C=_elem+mi; for (Rank i=0,j=0,k=0;(j<lb) ||(k<lc);){ if ((j<lb) && (!(k<lc) || B[j]<=C[k])) A[i++] =B[j++]; if ((k<lc) && (!(j<lb) || C[k]<B[j])) A[i++]=C[k++]; } delete [] B; } template <typename T> void Vector<T>::mergeSort(Rank lo,Rank hi){ if (hi-lo <2) return; int mi=(hi+lo)/2; mergeSort(lo,mi); mergeSort(mi,hi); merge(lo,mi,hi); } #endif