为什么我得到这个奇怪的错误时,试图添加一个重复的对象std::set

Why am I getting this strange error when trying to add a duplicate object to a std::set?

本文关键字:一个 set std 对象 添加 为什么 错误      更新时间:2023-10-16

这是给我麻烦的代码:

Relation* Relation::relation_union(Relation* r) {
    std::set<Tuple*>::iterator it1;
    for (it1 = tuples.begin(); it1 != tuples.end(); it1++) {                                          
        r->tuples.insert(*it1);         //this is where i insert into the set              
    }
    return r;
}

我不明白为什么这种事会发生在我的生活中。我用这段代码得到一个核心转储。

下面的代码可以很好地按字母顺序排列我的集合中的元组(这是字符串的向量),但我认为这是我的错误的来源,因为它不知道当每个元素都是相同的时候该怎么做:

EDIT对代码进行修改。

struct comp {
    bool operator ()(const Tuple * lt, const Tuple * rt) {
        for (unsigned i = 0; i < lt->values.size(); i++) {
            std::string strl = lt->values[i];
            std::string strr = rt->values[i];
            if (strl != strr) {
                return (strl < strr); // compares with the length
            }
        }
            return false;
    }
};

'tuples'来自以下代码:

Relation(){
        name = "";
        schema = new Schema();
        tuples = std::set<Tuple*, comp>();
        domain = std::set<std::string>();
    }
    std::string name;
    Schema* schema;
    std::set<Tuple*, comp> tuples;
    std::set<std::string> domain;
}

这是我的堆栈反向跟踪-它对我不是很有帮助:

Program received signal SIGABRT, Aborted.
0x00007ffff753b425 in raise () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) bt
#0  0x00007ffff753b425 in raise () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff753eb8b in abort () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x00007ffff7b9169d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff7b8f846 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff7b8f873 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff7b8f96e in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007ffff7b3c987 in std::__throw_out_of_range(char const*) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007ffff7b7a453 in std::string::substr(unsigned long, unsigned long) const () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#8  0x000000000040d889 in Input::getTokensValue (this=0x630460) at Input.cpp:91
#9  0x000000000040e812 in Lex::emit (this=0x7fffffffe130, tokenType=UNDEFINED) at Lex.cpp:268
#10 0x000000000040e12d in Lex::nextState (this=0x7fffffffe130) at Lex.cpp:106
#11 0x000000000040e026 in Lex::generateTokens (this=0x7fffffffe130, input=0x630460) at Lex.cpp:85
#12 0x000000000040da20 in Lex::Lex (this=0x7fffffffe130, filename=0x0) at Lex.cpp:17
#13 0x000000000040ea3e in main (argc=1, argv=0x7fffffffe248) at main.cpp:7

任何帮助都将非常感激。谢谢。

bool operator ()(const Tuple * lt, const Tuple * rt) {
    for (unsigned i = 0; i < lt->values.size(); i++) {
        std::string strl = lt->values[i];
        std::string strr = rt->values[i];
        if (strl != strr) {
            return (strl < strr); // compares with the length
        }
    }
    return false;//EDIT
 }

如果所有值相等,则comp::operator()应返回false

struct comp {
    bool operator ()(const Tuple * lt, const Tuple * rt) {
        for (unsigned i = 0; i < lt->values.size(); i++) {
            std::string strl = lt->values[i];
            std::string strr = rt->values[i];
            if (strl != strr) {
                return (strl < strr); // compares with the length
            }
        }
        return false;
    }
};

您的比较运算符期望两个操作数的'values'成员具有相同的大小。如果rt->values比lt->values短,您将得到另一个越界错误(但问题不是来自这里)。