c++ std::set插入导致段错误

标签 c++ stl set

全部-

我不太明白为什么这段代码会导致段错误...任何帮助都会很好。

#include <iostream>
#include <set>

using namespace std;

class A{
public:
    int _x;

    A(int x){
        _x = x;
    }
};

bool fncomp(A a1, A a2){
    return a1._x < a2._x;
}

int main(){
    bool(*fn_pt)(A,A) = fncomp;

    set<A, bool(*)(A,A)> testSet;
    for(int i=0; i<10; i++){
        cout << i << endl;
        A a(i);
        testSet.insert(a);
    }
}

输出是:

0
1
Segmentation Fault

最佳答案

好吧,看看你的代码。您声明了一个函数 fncomp,但您真的在任何地方使用该函数吗?您用它初始化了 fn_pt,但是 fn_pt 没有在任何地方使用。你不觉得奇怪吗?如果您从未要求您的 set 对象使用该函数,您如何期望您的 testSet 对象知道您希望它使用您的 fncomp 作为比较器?

您使用普通函数指针类型 bool(*)(A,A) 声明了您的集合 testSet 作为比较器类型。这是比较器的类型。现在,您必须通过构造函数参数将比较器的实际 传递给您的设置对象

set<A, bool(*)(A,A)> testSet(fn_pt);

set<A, bool(*)(A,A)> testSet(fncomp);

(你真的不需要那个中间指针 fn_pt)。

您忘记这样做了,set 对象使用了比较器的默认构造函数参数值,在本例中为空指针。因此,每次您的 testSet 对象尝试比较两个元素时,它都会通过空指针执行函数调用。难怪它会崩溃。

关于c++ std::set插入导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5424990/

相关文章:

c++ - 如何在C++中逐行读取字符串

c++ - 有没有办法将 boost 信号和插槽与不可复制的对象一起使用?

c++ - end() 以何种方式指向非连续容器中的 'one past the end'?

MySQL:SET 类型

java - 如何从 JAVA 中的两个集合中获取不匹配的字符串?

c++ - 如何让控制台文本刷新而不是重新输入?

c++ - 将 %APPDATA% 与 CreateProcessW 一起使用

c++ - 删除 2D vector 中的行 - 段错误

c++ - 从模板函数返回迭代器到 STL 容器

python - Pandas 数据帧 : How to do Set Union Aggregation over a rolling window