gpt4 book ai didi

c++ - 我在删除功能中遇到垃圾

转载 作者:行者123 更新时间:2023-11-30 03:01:53 36 4
gpt4 key购买 nike

我在用户定义的 vector 中收到垃圾。垃圾在删除函数之后出现,这是代码

    #if 1   // Make it 1 to enable this code

#include <iostream>
using namespace std;

class Vector{
protected:
int l;
int* v;
public:
Vector():l(0),v(0){
cout << "\nBase class: Vector: Default constructor" << endl;
}
Vector( int len ):l(len),v(new int[l]) {
cout << "Vector: Overloaded constructor" << endl;
}
void set( int i, int val)
{
if( l )
v[i] = val;
else{
cout << "Error: zero size vector\n exiting..." <<endl;
exit(5);
}
}
int get( int i)
{
if( l )
return v[i];
else{
cout << "Error: zero size vector\n exiting..." <<endl;
exit(5);
}
}
~Vector(){
cout << "Base dextructor" <<endl;
delete [] v;
}

};

class Vector1:public Vector{
private:

public:
Vector1():Vector(){
cout << "Derived class: Vector1:: Default constructor" << endl;
}
//my functions
int size()
{
return l;
}
int front()
{
return Vector::get(0);
}
int end()
{
return Vector::get(l-1);
}
void swap(int a,int b)
{
int temp=v[a];
v[a]=v[b];
v[b]=temp;
}
void find(int val)
{
bool flag=false;
for(int i=0;i<l;i++)
{
if(v[i]==val)
{
flag=true;
}
}
if(flag==true)
cout<<"\nValue ="<<val<<" =Exists in Vector";
else
cout<<"\nValue ="<<val<<" =doesnot Exists in Vector";
}
void erase(int val)
{

int *temp=new int[l-1];
int k=0;
for(int i=0;i<l;i++)
{
if(v[i]!=val)
{
temp[i]=v[i];
k++;
}
}
delete []v;
l=l-1;
v=new int[l];
for(int i=0;i<l;i++)
{
v[i]=temp[i];
}



}
int resize( int len )
{
if( l )
delete [] v;
l = len;
v = new int[l];
return (v!=0);
}
void set( int i, int val)
{
if( i>= 0 && i<l )
Vector::set( i, val );
else{
cout << "Error: index out of range\n exiting..." <<endl;
exit(3);
}
}
int get( int i)
{
if( i>= 0 && i<l )
return Vector::get(i);
else{
cout << "Error: index out of range\n exiting..." <<endl;
exit(3);
}
}
int & operator [](int i)
{
return v[i];
}

Vector1( int len ):Vector(len)
{

}

};

int main()
{
Vector vec;

Vector1 v1;
v1.resize( 4 );
v1.set( 2, 4);
v1.set( 1, 5);
v1.set( 0, 6);

int x = v1[2];

v1[3] = 77;
cout<<"\nSize of vector is=\n"<<v1.size();
//v1.set( 5, 4); // erroneous value
cout<<"\nFront of vector is=\n"<<v1.front();
cout<<"\nEnd of vector is=\n"<<v1.end();
//do swap between values
cout<<"\n";
v1.swap(1,3);
//now values are
cout<<"v1[1] is equals to= "<<v1[1];
cout<<"v1[3] is equals to= "<<v1[3];
v1.find(5);
v1.find(100);
cout<<"\nNow v1[0] is equals to= \n"<<v1[0];
v1.erase(6);
cout<<"\nNow v1[0] is equals to= \n"<<v1[0]<<" "<<v1[1];
cout<<"\n";
}
#endif

输出是这样的 enter image description here

v1[0] 应该是 5

最佳答案

在您的 erase 函数中,您实际上并没有删除给定的数字,您只是将 vector 中不等于给定数字的每个数字复制到一个新数组中。例如,如果 vector 中的内部数组包含数字 2、4、6 和 8,而您要删除 6,则只需将 2、4 和 8 复制到索引为 0、1 和 3 的新数组中,同时保留插槽 2在新数组中为未定义。然后创建比新数组短一个的第三个数组,并将除最后一项之外的所有内容复制到第三个数组中,包括未定义的槽 2,但不包括最后一个槽(应该保留)。

我认为使用 temp[k] = v[i] 可以解决您在 erase 函数中的问题,但请注意它仍然不是完美的解决方案,因为被删除的项目可能在 vector 中出现多次,或者它可能根本不存在,所以新长度并不总是比旧长度小一的情况。

关于c++ - 我在删除功能中遇到垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10665049/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com