C++ learning-关于 error LNK2019以及error C2244的 解决方案
//
#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