请问一个有关模板类的·有关问题 下面被注释掉的for循环为什么不能运行
请教一个有关模板类的·问题 下面被注释掉的for循环为什么不能运行
#include<iostream>
using std::cout;
using std::endl;
#include<stdexcept>
using std::runtime_error;
#include<cstdlib>//useful for malloc realloc
using std::malloc;
using std::realloc;
template<typename T>
class my_vector
{
private:
T*array;
unsigned size;
unsigned block_size;
public:
my_vector():array((T*)malloc(sizeof(T)*block_size)),size(0),block_size(5){};
my_vector(unsigned bsz):array((T*)malloc(sizeof(T)*bsz)),size(0),block_size(bsz){}
~my_vector(){if(array)free(array);}
void push_back(const T&elem)
{
if(size==block_size)
{
block_size*=2;
T *new_array=(T*)realloc(array,block_size*sizeof(T));
if(new_array!=NULL)
array=new_array;
else
{
free(array);
array=NULL;
throw runtime_error("Out of memory.");
}
}
array[size++]=elem;
}
T& operator[](unsigned i){return array[i];}
const T& operator[](unsigned i)const{return array[i];}
unsigned get_mem_size(){return block_size*sizeof(T);}
};
template<>
class my_vector<bool>
{
private:
int* array;
unsigned size;
unsigned block_size;
static const unsigned seg_size=sizeof(int)*8;
public:
my_vector(unsigned bsz=1):array{(int*)malloc(sizeof(int)*bsz)},size(0),block_size(bsz){}
~my_vector(){if(array)free(array);}
void push_back(bool elem)
{
if(size==block_size*seg_size)
{
block_size*=2;
int* new_array=(int*)realloc(array,block_size*sizeof(int));
if(new_array!=NULL)
array=new_array;
else
{
free(array);
array=NULL;
throw runtime_error("Out of memory.");
}
}
set(size++,elem);
}
void set(unsigned i,bool elem)
{
if(elem)
array[i/seg_size] |=(0x1<<(i%seg_size));
else
{
array[i/seg_size] &=~(0x1<<(i%seg_size));
}
}
bool operator[](unsigned i)const
{
return (array[i/seg_size] & (0x1<<(i%seg_size)))!=0;
}
unsigned get_mem_size()const{return sizeof(int)*block_size;}
};
int main()
{
my_vector<double> m_v0(10);
for(size_t i=0;i<50;i++)
m_v0.push_back(i);
for(size_t i=0;i<50;i++)
cout<<m_v0[i]<<" ";
cout<<endl;
cout<<"Done!\n";
my_vector<double> m_v1;
m_v1[0]=10000;
cout<<m_v1[0]<<endl;
m_v1.push_back(1000);
cout<<m_v1[1]<<endl;
for(size_t i=0;i<3;i++)
m_v1.push_back(i);
for(size_t i=0;i<5;i++)
cout<<m_v1[i]<<" ";
cout<<endl;
m_v1.push_back(1000000);
cout<<m_v1[5]<<endl;
m_v1.push_back(100000000);
for(size_t i=0;i<6;i++)
cout<<i<<" "<<m_v1[i]<<" ";
cout<<endl;
for(size_t i=1;i<4;i++)
m_v1.push_back(i);
for(size_t i=0;i<4;i++)
cout<<m_v1[i]<<" ";
cout<<endl;
cout<<"Done!\n"<<endl<<endl;
my_vector<char> vi(2);
my_vector<bool> vb(2);
for(size_t i=0;i<20;i++)
{
vi.push_back('a'+i);
vb.push_back((i%4)==0);
}
cout<<vb[0]<<endl;
cout<<vb[1]<<endl;
cout<<vb[2]<<endl;
cout<<vb[3]<<endl;
cout<<vb[4]<<endl;
cout<<vb[19]<<endl;
cout<<"Done!\n";
/*
for(unsigned i=0;i<2;i++)
cout<<vb[i]<<endl;
*/
cout<<"Done!\n";
cout<<"MemSize of my_vector<char> is "<<vi.get_mem_size()<<endl;
cout<<"MemSize of my_vector<bool> is "<<vb.get_mem_size()<<endl;
for(size_t i=0;i<20;i++)
cout<<" "<<vi[i];
cout<<endl;
/*
for(size_t i=0;i<20;i++)
cout<<vb[i];
cout<<endl;
*/
return 0;
}
------解决思路----------------------
my_vector(unsigned bsz=1):array{(int*)malloc(sizeof(int)*bsz)},size(0),block_size(bsz){}
构造函数写错了:
my_vector(unsigned bsz=1):array((int*)malloc(sizeof(int)*bsz)),size(0),block_size(bsz){}
还有一个错误:
my_vector():array((T*)malloc(sizeof(T)*block_size)),size(0),block_size(5){};
初始化array的时候block_size还没有赋值,所以array的构造是有问题的
#include<iostream>
using std::cout;
using std::endl;
#include<stdexcept>
using std::runtime_error;
#include<cstdlib>//useful for malloc realloc
using std::malloc;
using std::realloc;
template<typename T>
class my_vector
{
private:
T*array;
unsigned size;
unsigned block_size;
public:
my_vector():array((T*)malloc(sizeof(T)*block_size)),size(0),block_size(5){};
my_vector(unsigned bsz):array((T*)malloc(sizeof(T)*bsz)),size(0),block_size(bsz){}
~my_vector(){if(array)free(array);}
void push_back(const T&elem)
{
if(size==block_size)
{
block_size*=2;
T *new_array=(T*)realloc(array,block_size*sizeof(T));
if(new_array!=NULL)
array=new_array;
else
{
free(array);
array=NULL;
throw runtime_error("Out of memory.");
}
}
array[size++]=elem;
}
T& operator[](unsigned i){return array[i];}
const T& operator[](unsigned i)const{return array[i];}
unsigned get_mem_size(){return block_size*sizeof(T);}
};
template<>
class my_vector<bool>
{
private:
int* array;
unsigned size;
unsigned block_size;
static const unsigned seg_size=sizeof(int)*8;
public:
my_vector(unsigned bsz=1):array{(int*)malloc(sizeof(int)*bsz)},size(0),block_size(bsz){}
~my_vector(){if(array)free(array);}
void push_back(bool elem)
{
if(size==block_size*seg_size)
{
block_size*=2;
int* new_array=(int*)realloc(array,block_size*sizeof(int));
if(new_array!=NULL)
array=new_array;
else
{
free(array);
array=NULL;
throw runtime_error("Out of memory.");
}
}
set(size++,elem);
}
void set(unsigned i,bool elem)
{
if(elem)
array[i/seg_size] |=(0x1<<(i%seg_size));
else
{
array[i/seg_size] &=~(0x1<<(i%seg_size));
}
}
bool operator[](unsigned i)const
{
return (array[i/seg_size] & (0x1<<(i%seg_size)))!=0;
}
unsigned get_mem_size()const{return sizeof(int)*block_size;}
};
int main()
{
my_vector<double> m_v0(10);
for(size_t i=0;i<50;i++)
m_v0.push_back(i);
for(size_t i=0;i<50;i++)
cout<<m_v0[i]<<" ";
cout<<endl;
cout<<"Done!\n";
my_vector<double> m_v1;
m_v1[0]=10000;
cout<<m_v1[0]<<endl;
m_v1.push_back(1000);
cout<<m_v1[1]<<endl;
for(size_t i=0;i<3;i++)
m_v1.push_back(i);
for(size_t i=0;i<5;i++)
cout<<m_v1[i]<<" ";
cout<<endl;
m_v1.push_back(1000000);
cout<<m_v1[5]<<endl;
m_v1.push_back(100000000);
for(size_t i=0;i<6;i++)
cout<<i<<" "<<m_v1[i]<<" ";
cout<<endl;
for(size_t i=1;i<4;i++)
m_v1.push_back(i);
for(size_t i=0;i<4;i++)
cout<<m_v1[i]<<" ";
cout<<endl;
cout<<"Done!\n"<<endl<<endl;
my_vector<char> vi(2);
my_vector<bool> vb(2);
for(size_t i=0;i<20;i++)
{
vi.push_back('a'+i);
vb.push_back((i%4)==0);
}
cout<<vb[0]<<endl;
cout<<vb[1]<<endl;
cout<<vb[2]<<endl;
cout<<vb[3]<<endl;
cout<<vb[4]<<endl;
cout<<vb[19]<<endl;
cout<<"Done!\n";
/*
for(unsigned i=0;i<2;i++)
cout<<vb[i]<<endl;
*/
cout<<"Done!\n";
cout<<"MemSize of my_vector<char> is "<<vi.get_mem_size()<<endl;
cout<<"MemSize of my_vector<bool> is "<<vb.get_mem_size()<<endl;
for(size_t i=0;i<20;i++)
cout<<" "<<vi[i];
cout<<endl;
/*
for(size_t i=0;i<20;i++)
cout<<vb[i];
cout<<endl;
*/
return 0;
}
------解决思路----------------------
my_vector(unsigned bsz=1):array{(int*)malloc(sizeof(int)*bsz)},size(0),block_size(bsz){}
构造函数写错了:
my_vector(unsigned bsz=1):array((int*)malloc(sizeof(int)*bsz)),size(0),block_size(bsz){}
还有一个错误:
my_vector():array((T*)malloc(sizeof(T)*block_size)),size(0),block_size(5){};
初始化array的时候block_size还没有赋值,所以array的构造是有问题的