我的代码在某些情况下不起作用:当c1
为4
时,它不会输出任何内容,但它适用于大于9的数字。为什么会这样?
#include<iostream>
#include<vector>
using namespace std;
void insertfast(vector<int>&v, int c)
{
if (c >= v[v.size()-1])v.push_back(c);
if (c <= v[0])v.insert(v.begin(), c);
int min = 1;
int max = v.size();
while (v.size() != 9) {
int i = (min + max) / 2;
if (v[i - 1] <= c && c <= v[i])v.insert(v.begin() + i, c);
if (v[i] <= c && c <= v[i + 1])v.insert(v.begin() + (i + 1), c);
if (c < v[i])
max = i;
else
min = i;
}
}
int main()
{
vector<int>v1 = { 2,5,9,22,44,55,88,777 };
int c1 = 4;
insertfast(v1, c1);
for (int i = 0; i < 9; i++)
cout << v1[i] << endl;
}
答案 0 :(得分:1)
您的代码中存在两个逻辑问题:
对于insertfast()
功能中的测试数据,您进入while()
,当您进入第一个if (v[i - 1] <= c && c <= v[i])
时,您插入4
值并且变为{{1}然后你就可以直接进入下一个v[1]
,所以你需要设置第二个if (v[i] <= c && c <= v[i + 1])
,如下所示:
else if
从上一项开始,你的向量增加了2个元素,因此他的大小变为if (v[i - 1] <= c && c <= v[i])
{
v.insert(v.begin() + i, c);
}
else if (v[i] <= c && c <= v[i + 1])
{
v.insert(v.begin() + (i + 1), c);
}
,你有无限循环10
,我认为你可以while (v.size() != 9)
来在成功的情况下留下循环插入:
break
如果已插入元素,则无需进一步运行循环。
实际上,带有if (v[i - 1] <= c && c <= v[i])
{
v.insert(v.begin() + i, c);
break;
}
else if (v[i] <= c && c <= v[i + 1])
{
v.insert(v.begin() + (i + 1), c);
break;
}
的第2项会修复并且break
缺少问题,如果插入则会留下循环,并且无法进入第二项。
答案 1 :(得分:1)
让我们花一点时间来逻辑地逐步完成代码,因为我认为这是一个功课问题,了解如何做到这一点很重要。有些调试器等工具用于大型项目和更困难的问题,但像这样的小逻辑错误一直在发生。
好的,insertfast()
是一个以有序方式将int
插入vector<int>
的功能。你要做的第一件事就是比较矢量的第一个和最后一个元素。
if (c >= v[v.size() - 1])
v.push_back(c);
if (c <= v[0])
v.insert(v.begin(), c);
我们只能是其中之一,如果其中任何一个是真的,我们就完成了。所以这里最好的选择是从函数return
开始,我们不关心做任何其他事情。我们知道,但程序没有。它将继续比较我们不想比较和错误的事情。
if (c >= v[v.size() - 1]) {
v.push_back(c);
return;
}
if (c <= v[0]) {
v.insert(v.begin(), c);
return;
}
如果这两个陈述都是假的,我们还在函数中怎么办?我们仍然需要计算插入此值的位置,因此我们遍历元素。
while (v.size() != 9)
这是一个非常差的条件循环,因为如果我们将大小为8的向量传递给函数,它将仅工作。使用你的特定算法,你基本上想要循环,直到向量中添加一些值。我建议一个无条件循环(我们试图“快速”)也就是一个无限循环,并明确地在循环中返回或中断。
int min = 1;
int max = v.size();
while (1) {
int i = (min + max) / 2;
if (v[i - 1] <= c && c <= v[i]) {
v.insert(v.begin() + i, c);
return;
}
if (v[i] <= c && c <= v[i + 1]) {
v.insert(v.begin() + (i + 1), c);
return;
}
if (c < v[i])
max = i;
else
min = i;
}
break
而不是return
在这里也可以正常工作,因为如果你突破这个循环,函数的结尾会被击中而你只是返回。因此,我们只需重新思考设计并逐步完成代码即可解决问题。