我正在尝试构建矢量库。代码如下所示
#include <iostream>
#include <string>
namespace std
{
template<typename T>
class vector
{
private:
T* value;
T* temp;
int arraySize{1};
public:
vector()
{
value=NULL;
temp=NULL;
}
int size()
{
return arraySize;
}
void push(T val)
{
if(value==NULL)
{
value=new T[arraySize];
value[arraySize-1]=val;
}
else if(value!=NULL)
{
arraySize=arraySize+1;
temp=new T[arraySize];
int lastIndex=arraySize-1;
for(int j=0;j<lastIndex;j++)
{
temp[j]=value[j];
}
temp[lastIndex]=val;
delete[] value;
value=temp;
temp=NULL;
}
}
T pop()
{
int popIndex=arraySize-1;
T t = value[popIndex];
arraySize=arraySize-1;
if(arraySize>=0)
{
temp=new T[arraySize];
for(int j=0;j<popIndex;j++)
{
temp[j]=value[j];
}
delete[] value;
value=temp;
temp=NULL;
return t;
}
else if(arraySize<0)
{
std::cout<<"Memory underflow\n";
reset();
}
}
T operator[](int index)const
{
return value[index];
}
T front()const
{
return (value[arraySize-1]);
}
T back()const
{
return (value[0]);
}
private:
void reset()
{
arraySize=1;
vector();
}
};
}
int main()
{
std::vector<std::string> v;
v.push("1");
v.push("2");
v.push("3");
std::cout<<"the element is : "<<v[1]<<"\n";
std::cout<<"front element is : "<<v.front()<<"\nback(last) element is : "<<v.back()<<"\n";
std::cout<<"size : "<<v.size()<<"\n";
std::cout<<v.pop()<<"\n";
std::cout<<v.pop()<<"\n";
std::cout<<"size : "<<v.size()<<"\n";
v.push("4");
std::cout<<"size : "<<v.size()<<"\n";
std::cout<<v.pop()<<"\n";
std::cout<<"size : "<<v.size()<<"\n";
}
我为v[1]重载了这个[]运算符,但是我想写成这样的例子v[2]="2";
我该怎么做请帮帮忙。如果要做的话,请提出一些代码修改的建议
我试图寻找=运算符的重载,但它告诉你只能接受一个参数
1条答案
按热度按时间nlejzf6q1#
让我们把它分解成一个更简单的例子,因为坦率地说,你的代码有太多的问题要在一个答案中解决。评论中提到了其中的一些,你应该认真对待,因为你的
vector
非常坏。让我们只考虑一个方法的实现,它返回一些你可以赋值的东西。换句话说,我们想写这样的代码:输出应为
42
。我们需要一个默认构造函数。我们需要一个
push
方法来设置一个字符串。作为成员的单个字符串就足够了。要让f.get() = "42";
工作,您不需要实现operator=
。被赋值的是字符串。std::string
已经拥有operator=
。但是,get()
应该返回对内部字符串的引用。它不应返回内部字符串的副本,因为修改该副本不会对成员产生影响。返回引用。Live Demo
为了进一步阅读我推荐…