在我的程序中,有一部分需要对struct数组进行排序。 一切都很顺利,直到最后我想。 对于某些条目,一切都很好,直到数组末尾的一些条目。 在那里它引发了分段错误,我不知道为什么。
struct overview_table{
string o_timestamp;
string n_timestamp;
string dbID;
};
sort(overview.begin(),overview.end(),compareStrings);
static bool compareStrings(const overview_table &a_timestamp, const overview_table &b_timestamp){
cout << "744" << endl;
if ( a_timestamp.n_timestamp.compare(b_timestamp.n_timestamp) <= 0){
cout << "746" << endl;
return true;
} else {
cout << "749" << endl;
return false;
}
}
有关信息:输出仅用于检查抛出分段错误的位置。它介于744和746之间,以及我在数组末尾的思考方式。但我不知道为什么
答案 0 :(得分:1)
如果我没错,要对2个结构进行排序,你必须比较整个结构,而不仅仅是一个字段。而且您只是比较 n_timestamp 字段。其次,你不要把&lt; =放在比较中,而只是&lt;或&gt;。
这是运算符重载的示例:
bool operator<(const overview_table &a, const overview_table &b)
{
if ( a.n_timestamp.compare(b.n_timestamp) < 0) {return true;}
if ( a.n_timestamp.compare(b.n_timestamp) > 0) {return false;}
if ( a.o_timestamp.compare(b.o_timestamp) < 0) {return true;}
if ( a.o_timestamp.compare(b.o_timestamp) > 0) {return false;}
return a.dbID.compare(b.dbID);
}
希望这会有所帮助。请问我是否不清楚!
答案 1 :(得分:0)
多一点来源会很好......
但首先:在相等的情况下,compare应该返回0,所以你的
if ( a_timestamp.n_timestamp.compare(b_timestamp.n_timestamp) <= 0)
没有任何意义......否则(如果它的意图)你的功能名称会产生误导。
要弄清楚,你的分段错误来自哪里,我们需要看到更多的源代码,但是分段错误表明你试图从空指针访问nestet值,所以在你的情况下似乎是你的一个比较结构从未创建过......
哪个可以并且应该由if (null == x)
返回false检查;或类似的东西
答案 2 :(得分:0)
比较函数应满足弱排序原则。
按以下方式更改功能
static bool compareStrings( const overview_table &a_timestamp,
const overview_table &b_timestamp )
{
return a_timestamp.n_timestamp < b_timestamp.n_timestamp;
}