如何在不使用标准算法的情况下在排序向量中添加c元素?

时间:2018-05-10 19:43:04

标签: c++ c++11 visual-c++

我的代码在某些情况下不起作用:当c14时,它不会输出任何内容,但它适用于大于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;
}

2 个答案:

答案 0 :(得分:1)

您的代码中存在两个逻辑问题:

  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. 从上一项开始,你的向量增加了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
  3. 如果已插入元素,则无需进一步运行循环。 实际上,带有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在这里也可以正常工作,因为如果你突破这个循环,函数的结尾会被击中而你只是返回。因此,我们只需重新思考设计并逐步完成代码即可解决问题。