我正在尝试使用c ++中的vector实现合并排序,我收到以下错误 - 抛出' std :: bad_alloc'的实例后终止调用。 bad_alloc还有其他解决方案,但它没有帮助。
问题是合并功能 -
#include<iostream>
#include<vector>
using namespace std;
void print(vector<int> v)
{
for(int i=0; i<v.size(); i++)
cout << v[i] << " ";
cout << endl;
}
vector<int> merging(vector<int> left, vector<int> right)
{
vector<int> result;
while((int)left.size()>0 && (int)right.size()>0)
{
if((int)left.front()<=(int)right.front()){
result.push_back(left.front());
//left.erase(left.begin());
}
else{
result.push_back(right.front());
//left.erase(right.begin());
}
}
while((int)left.size()>0){
for(int j=0; j<(int)left.size(); j++)
result.push_back(left[j]);
}
while((int)right.size()>0){
for(int k=0; k<(int)right.size(); k++)
result.push_back(right[k]);
}
cout << "check merging";
return result;
}
int main()
{
vector<int> a, b, result;
a.push_back(38);
a.push_back(27);
b.push_back(43);
b.push_back(3);
cout << a.front() << endl;
print(a);
cout << endl;
print(b);
cout << endl;
result = merging(a, b);
print(result);
}
谢谢
答案 0 :(得分:2)
当operator new和operator new []的标准定义未能分配所请求的存储空间时抛出的异常类型。
你的内存不足,当你不能再分配时会抛出异常。
尝试查看循环的退出条件。
while((int)left.size()>0 && (int)right.size()>0)
在left
和right
都为空之前,此循环不会退出,但是您永远不会更改其大小(erase
调用已被注释掉。)
另外两个while循环有类似的问题。
答案 1 :(得分:1)
第一个while循环永远不会终止。它会不断向结果中添加元素,直到内存耗尽为止。
您的代码还有其他问题:
在left.front()&lt; = right.front的情况下,你永远不会从左边删除你输入的元素,它会被注释掉。
在其他情况下,您也不会从right
中删除。注释掉的代码将从left
中删除,将right
的迭代器混合到left
的擦除中,技术上称为“未定义的行为”,意味着您的程序是吐司。
另外,为什么你到处投射到int?那太没必要了
即使您要从左前方和右前方擦除,也可以使用矢量从前面移除,矢量不能有效支持这些操作。没有必要这样做,您可以使用迭代器遍历left
和right
,检查它们是否为空,因为左迭代器是否到达left
的末尾以及是否正确迭代器到达right
答案 2 :(得分:0)
你有一个无限循环。
while((int)left.size()>0 && (int)right.size()>0)
{
if((int)left.front()<=(int)right.front()){
result.push_back(left.front());
//left.erase(left.begin());
}
else{
result.push_back(right.front());
//left.erase(right.begin());
}
}
永远不会结束,因为您永远不会从left