分类向量时的segfault
Segfault while sorting vector
作为练习,我在模板中实现了QuickSort算法,并且对于元素数量较低的向量(最多约760),它"工作正常",但给出了更高数量的seqfault元素。有人可以告诉我我做错了什么:
template< typename Vector, typename VecElem > void qsort(Vector *pv)
{
if (pv->size()<=1) return;
VecElem p;
Vector *pvl=new Vector,*pvr=new Vector;
p = pv->back();
pv->pop_back();
pvr->push_back(p);
for (auto it=pv->begin();it!=pv->end();it++)
{
if (*it < p) pvl->push_back(*it);
else pvr->push_back(*it);
}
qsort<Vector,VecElem>(pvl);
qsort<Vector,VecElem>(pvr);
if (pvl->size()) *pv = *pvl;
if (pvr->size()) std::copy(pvr->begin(), pvr->end(), std::back_inserter(*pv));
delete pvl;
delete pvr;
}
正如其他指出的那样,例如对升数据进行排序。但是,这并不是您的segfault的原因。代码中的问题是您在分区阶段不排除枢轴元素。
只需尝试对仅由两个相同元素组成的向量(例如{0,0})组成。它将无限地循环。
要解决问题,请在两个向量分类后插入枢轴元素。
也许这起作用(至少可以修复堆栈溢出):
pvr->push_back(p); // remove this line
// and insert it later...
qsort<Vector,VecElem>(pvl);
qsort<Vector,VecElem>(pvr);
pvl->push_back(p); // this line is new
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- C++中带有List类的迭代器Segfault
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 包含向量引起segfault的sTL矢量
- 分类向量时的segfault
- 调整指针segfault的向量大小
- 使用向量和 fstream 的代码中的 Segfault 11?C++
- 当返回包含向量的空向量时,C++Segfault
- 尝试访问向量中对象中的字段时出现Segfault
- 字符串的C++向量segfault