首页 > 解决方案 > 如何在不使用标准算法的情况下在排序向量中添加 c 元素?

问题描述

我的代码在某些情况下不起作用:当c1is时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;
}

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

解决方案


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

  1. 对于你insertfast()进入的函数中的测试数据while(),当你第一次进入时,if (v[i - 1] <= c && c <= v[i])你插入4值并进入变成v[1],然后你就可以进入下一步if (v[i] <= c && c <= v[i + 1]),所以你需要设置第二个 if as else if,如下所示:

    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);
    }
    
  2. 从上一项开始,您的向量增加了 2 个元素,因此他的大小变为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;
    }
    

如果您已插入元素,则无需进一步运行循环。实际上第二个项目break将修复和else丢失问题,如果插入它将离开循环并且将无法进入第二个如果。


推荐阅读