std::sort 具有相等的元素会导致分段错误

2023-12-06

我有一个存储指针的容器。我试图根据指针指向的相应对象中的数据成员以非递增顺序对这些指针进行排序。就我而言,许​​多对象可能具有相同的该数据成员值。

下面是一段简短的代码来说明问题。对排序函数的调用给出了分段错误。奇怪的是,如果容器中有 16 个元素指向具有相同双精度值的对象,则排序似乎有效。但是如果我有 17 个元素指向具有相同值的对象,则会出现段错误。

谁能解释一下为什么会发生这种情况?

#include <iostream>
#include <algorithm>
#include <deque>

//some class
class A {
public:
    double a;
    A(double aval);
};

A::A(double aval) : a(aval) {}

//compare class
struct cmp_A : std::greater_equal<A*> {
    bool operator() (const A* x, const A* y) const;
} cmp_A_obj;

//greater_equal comparison
bool cmp_A::operator() (const A* x, const A* y) const {
    return (x->a >= y->a);
}

int main() {
    std::deque<A*> Adeque;
    //insert 17 A pointers into the container
    for(int i = 1; i<=17; i++) {
        Adeque.push_back(new A(5));
    }

    //This call to sort gives a Segmentation fault
    std::sort(Adeque.begin(), Adeque.end(), cmp_A_obj);

    for(std::deque<A*>::iterator i = Adeque.begin(); i!= Adeque.end(); i++) {
        std::cout << "|" << (*i)->a;
    }
    std::cout << std::endl;
}

您的比较必须实现严格弱序。小于或等于不满足这一点。它应该相当于运算符中实现的“小于”或“大于”< and >例如,对于整数。

元素的相等性通过应用此排序两次来确定:

(!cmp(a,b)) && (!cmp(b,a)); // if this is false, a == b
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::sort 具有相等的元素会导致分段错误 的相关文章

随机推荐

  • android 中如何检测来电掉线

    我正在编写一个应用程序 该应用程序在电话通话期间在后台运行 并在通话结束后将坐标记录到文件中 我知道 Android 电话 API 可以检测用户手动断开呼叫 纠正我 如果我错了 但我想知道服务断开是否是由于掉话造成的 有没有办法或API可以
  • 使用 SortableBindingList 的 DataGridView

    我有一个返回 IList 的函数 它是 DataGridView 的数据源 我了解到 DataGridView 不会对 IList 进行排序 我读这个 stackoverflow 问答我正在尝试实现 SortableBindingList
  • 通过将图像高度设置为容器高度来使图像适合其容器

    假设我有container a 它有一定的高度 以像素为单位 假设我在container a中有另一个container b 它是container a的80 现在假设我想将具有一定高度 以像素为单位 的图像放入容器中 b 如何使图像与co
  • 即使在 FormsAuthentication.SignOut() 之后 User.IsOnline = true

    我已在 web config 中设置 UserIsOnlineTimeWindow 2 然后我的 logout 函数已修改为 public ActionResult LogOff MembershipUser usr Membership
  • 使用D3,语义缩放可以应用于径向树吗?

    我用的是D3节点链接树 并且我在尝试对其应用语义缩放时遇到困难 我已经花了一些时间大惊小怪 试图让它发挥作用 所以我想我会在这里问 在我花更多时间之前看看它是否可能 我不确定语义缩放是否是线性的 仅此而已 编辑 工作解决方案 这是我的工作解
  • 如何使用 HttpURLConnection 在 Java 中等待 Expect 100-Continue 响应

    I am stuck使用 HttpURLConnection 向 Web 服务器发出 PUT http 请求 我有一些代码可以很好地发出 PUT 请求 并且我可以在标头中简单地包含 期望 100 继续请求属性 但是尽我所能尝试 我似乎无法让
  • Python:如果包含/不包含顺序相同,则从列表中删除子列表

    有没有办法从列表列表中删除重复的子列表 即使它们的顺序不同 那么我可以做类似 make 的事情吗 x 1 2 3 4 5 6 2 1 7 8 into x 1 2 3 4 5 6 7 8 是否有 itertools 函数或带有 for 循环
  • Swift 中优雅的“有界”方法

    我正在寻找一种更优雅的方法来为数字创建有界限制器 主要用于设置器 有很多技术可以确定一个值是否在界限内 但我没有看到任何本机函数来强制传入值符合这些界限 接受的答案here很接近 但我想限制这些值 而不是仅仅强制执行它们 这是我到目前为止所
  • 新的 GHC 功能——是我想象的吗?

    我发誓我在最近的一组 GHC 发行说明中看到了一个新功能 但现在我找不到任何参考资料 是我的错觉 还是这个功能真的存在 这是与加载不完整的模块有关 据我所知 它允许您关闭由于未定义变量而导致的编译错误 当然 在运行时 如果您尝试实际执行 这
  • 自调用函数 javascript

    我在 Firefox 和 Chrome 中编写了一个自调用函数 但它不会调用 我写了一些东西 大意是 function alert THE 自调用函数在当前浏览器中不起作用吗 我确实包含了页面上所有必要的标签和所有其他代码 自调用函数 实际
  • 如何递归地遍历 PyGtk 中的所有 Gtk 子项?

    我想获得主窗口的所有 Gtk 子对象的递归列表pygtk 我怎么做 注意这些 Python GTK 小部件名称 Python 递归和返回语句 这是一个函数 它是 PHP 函数的一个端口按名称获取后代 子 小部件 PHP GTK 社区 htt
  • Jboss 5,类加载器和多个类实例

    我的申请有问题 为了恢复这个问题 我必须将应用程序从 jboss 4 迁移到 jboss 5 在战争部署过程中 我遇到了这样的错误 java lang LinkageError loader constraint violation whe
  • 如何在 CUDA 中(有效地)打包位?

    我有一个字节数组 其中每个字节都是 0 或 1 现在我想将这些值打包成位 以便 8 个原始字节占用 1 个目标字节 原始字节 0 进入位 0 字节 1 进入位 1 ETC 到目前为止 我在内核中有以下内容 const uint16 t ti
  • pandas 数据帧计数唯一列表

    如果数据框中列的类型是int float or string 我们可以得到它的独特值columnName unique 但是 如果此列是一个列表 例如 1 2 3 我怎样才能得到unique本专栏的 我认为你可以将值转换为元组 然后uniq
  • Twitter 登录失败

    当我在我的android应用程序中使用twitter登录时 我遇到了一些问题 错误日志如下 09 05 15 38 48 492 22119 22119 sg com conversant swiftlive E Twitter Faile
  • 获取压缩文件的 mime 类型

    获取上传文件的 mime 类型非常简单 echo mime content type fileatt tmp name 但是 我还想检查压缩文件中包含的文件的 mime 类型 解压我的文件后 循环遍历 zip 中的文件以及位置 i是当前文件
  • 哪种方法性能更好:.Any() 与 .Count() > 0?

    in the System Linq命名空间 我们现在可以扩展我们的IE可枚举拥有Any and Count 扩展方法 最近有人告诉我 如果我想检查一个集合中是否包含 1 个或多个项目 我应该使用 Any 扩展方法而不是 Count gt
  • 如何在 JEST 测试用例中检查全局获取的响应

    因此 我使用 jest 来测试我的节点函数 该函数调用 fetch APi 来获取数据 现在当我为其编写测试用例时 我收到如下错误 expect received resolves toEqual Matcher error receive
  • 安装 Crashlytics 时出错 - SSL 对等握手失败 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 在尝试安装 Crashlytics 时 我收到此错误 安装 Crashlytics 3 7 2 usr bin curl f L o gt var folders 7x kp
  • std::sort 具有相等的元素会导致分段错误

    我有一个存储指针的容器 我试图根据指针指向的相应对象中的数据成员以非递增顺序对这些指针进行排序 就我而言 许 多对象可能具有相同的该数据成员值 下面是一段简短的代码来说明问题 对排序函数的调用给出了分段错误 奇怪的是 如果容器中有 16 个