c++ - 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
问题描述
我的代码在某些情况下不起作用:当c1
is时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;
}
解决方案
您的代码中有两个逻辑问题:
对于你
insertfast()
进入的函数中的测试数据while()
,当你第一次进入时,if (v[i - 1] <= c && c <= v[i])
你插入4
值并进入变成v[1]
,然后你就可以进入下一步if (v[i] <= c && c <= v[i + 1])
,所以你需要设置第二个 if aselse 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 个元素,因此他的大小变为
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
丢失问题,如果插入它将离开循环并且将无法进入第二个如果。
推荐阅读
- java - Android 9 中的 AutoUpdate 应用程序在解析时抛出错误
- c# - 在 Zebra SDK 中找不到“UsbConnection()”类
- makefile - 无法使用介子安装 glib 库
- python-3.x - 具有外生变量和线性时间趋势的 StatsModels SARIMAX
- oracle - Oracle 触发器无法在 if 子句中包含逻辑
- python - 在 pandas 中创建新列引发 AttributeError:(“'str' 对象没有属性 'str'”,'发生在索引 0')
- python - 如何使用 Chromedriver 和 Selenium Python 在 Instagram 登录页面中找到用户名和密码字段
- javascript - 在 JavaScript 中更改数组中的值
- python-3.x - Apache Beam Jupyter Notebook:ImportError:无法从“google.cloud”(未知位置)导入名称“storage”
- android - 重构活动仅在提供的数据上有所不同