gpt4 book ai didi

c++ - 我对 C++ 中的 STL 相当陌生,我尝试使用 vector 制作堆。没有得到想要的输出

转载 作者:行者123 更新时间:2023-12-02 09:48:15 27 4
gpt4 key购买 nike

#include<bits/stdc++.h>
using namespace std;
class Heap
{
vector <int> v;
int length;
public:
void create(vector <int> v, int s);
void display();
};
void Heap::create(vector <int> v, int s)
{
length=s+1;
for(int i=1;i<=s;i++)
{
this->v[i]=v[i-1];
}
int temp;
int j;
for(int i=2;i<length;i++)
{
temp=v[i];
j=i;
while(j>1&&temp>v[j/2])
{
swap(v[j],v[j/2]);
j=j/2;
}
if(j==1)
{
v[j]=temp;
}
}
}

void Heap::display()
{
for(int i=1;i<length;i++)
{
cout<<v[i]<<"\t";
}
cout<<endl;
}

int main()
{
vector <int> v;
int ans=1;
int d;
while(ans==1)
{
cout<<"Enter the Data\n";
cin>>d;
v.push_back(d);
cout<<"Do you want to enter more data?\n";
cin>>ans;
}
cout<<endl;
Heap h;
h.create(v,((int)v.size()));
h.display();
}

当我执行此代码时,它要求我输入数据值。我输入我要输入的所有数据值,然后单击输入按钮。它显示段错误。执行也需要很多时间,这是非常不寻常的。我使用代码块版本 20。

最佳答案

When i execute this code, it asks me to enter the data value. i enter all the data values i want to enter and click the enter button


是的,我对猜测您键入的内容以重现您的问题不感兴趣。我也没有兴趣猜测问题是出在您的 I/O 代码中还是您认为正在测试的代码中。
准备 minimal reproducible example 时,请务必删除交互式输入。这样其他人就可以真正复制它。
有时删除交互式输入可能会解决您的问题,在这种情况下,您已经学到了一些重要的东西(并且可能想就您的输入代码提出不同的问题)。

it shows segmentation error


段错误会在它发生的确切点中断您的程序。如果你在调试器中运行你的程序,它会告诉你它在哪里,以及当它发生时你程序中所有东西的状态。你应该试试这个,并学会使用你的调试器。
        this->v[i]=v[i-1];
正如另一个答案中正确指出的那样,这条线上有一个错误。
您正确调用了 push_back在读取输入时,你可以在这里做同样的事情。或者,您需要明确调整 this->v 的大小在索引不存在的元素之前。
这个函数的另一个主要问题是它混淆了 this->v。 (非法使用,仅在上一行使用一次)和 v这是 v 的本地拷贝在 main ,并且超出范围并在函数结束时永远丢失。
只需给你的变量起不同的名字,这样你就不必写 this->v在您当前引用的所有其他行上 v .另外,考虑传递原始的 v通过 const ref 而不是制作拷贝。
注意。我确实看到并理解您故意切换到基于 1 的索引进行排序。如果由于某种原因您不能只使用 std::sortstd::make_heap ,您至少可以将第零个元素显式设置为零,然后只需 std::copy其余的部分。
最后, Heap::create看起来它应该只是一个构造函数。强制两阶段初始化通常是不好的风格,我在这里看不出有任何理由。

关于c++ - 我对 C++ 中的 STL 相当陌生,我尝试使用 vector 制作堆。没有得到想要的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63050893/

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