带有比较函数的 STL 排序函数中的错误
error in STL sort function with Compare function
我尝试对元素类型为 class 的向量进行排序,如下所示:
void sort_test() {
class A{
public:
A(float x, float y, float z):score_(x),rerank_score_(y),ranking_score_(z) {};
float score_;
float rerank_score_;
float ranking_score_;
};
using A_ptr = std::shared_ptr<A>;
auto CompareA_ptr = [](A_ptr x, A_ptr y) {
if (x == nullptr && y != nullptr) {
return false;
} else if (x == nullptr && y == nullptr) {
return false;
} else if (x != nullptr && y == nullptr) {
return true;
} else {
if (x->rerank_score_ > y->rerank_score_) {
return true;
} else if (x->rerank_score_ < y->rerank_score_) {
return false;
} else {
if (x->score_ > y->score_) {
return true;
} else if (x->score_ < y->score_) {
return false;
} else {
return x->ranking_score_ >= y->ranking_score_;
}
}
}
};
std::vector<A_ptr> X;
for (int i = 0; i < 7; ++i) {
X.push_back(std::make_shared<A>(A(0.1, 0.1, 0.1)));
}
std::sort(X.begin(), X.end(), CompareA_ptr);
}
int main(){
sort_test();
return 0;
}
我 运行 Xcode 中的代码并得到 Xcode 错误“线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)” 18=]:
我发现代码运行在vector size小于7时正确,而在vector size大于7时报错,很困扰我。
感谢任何回复。
在 Visual Studio 中测试您的代码表明 CompareA_ptr
没有定义 严格的弱排序 作为 comparator 的要求。这会导致未定义的行为。
罪魁祸首似乎是
return x->ranking_score_ >= y->ranking_score_;
其中 >=
应更改为 >
return x->ranking_score_ > y->ranking_score_;
我尝试对元素类型为 class 的向量进行排序,如下所示:
void sort_test() {
class A{
public:
A(float x, float y, float z):score_(x),rerank_score_(y),ranking_score_(z) {};
float score_;
float rerank_score_;
float ranking_score_;
};
using A_ptr = std::shared_ptr<A>;
auto CompareA_ptr = [](A_ptr x, A_ptr y) {
if (x == nullptr && y != nullptr) {
return false;
} else if (x == nullptr && y == nullptr) {
return false;
} else if (x != nullptr && y == nullptr) {
return true;
} else {
if (x->rerank_score_ > y->rerank_score_) {
return true;
} else if (x->rerank_score_ < y->rerank_score_) {
return false;
} else {
if (x->score_ > y->score_) {
return true;
} else if (x->score_ < y->score_) {
return false;
} else {
return x->ranking_score_ >= y->ranking_score_;
}
}
}
};
std::vector<A_ptr> X;
for (int i = 0; i < 7; ++i) {
X.push_back(std::make_shared<A>(A(0.1, 0.1, 0.1)));
}
std::sort(X.begin(), X.end(), CompareA_ptr);
}
int main(){
sort_test();
return 0;
}
我 运行 Xcode 中的代码并得到 Xcode 错误“线程 1:EXC_BAD_ACCESS (code=EXC_I386_GPFLT)” 18=]:
我发现代码运行在vector size小于7时正确,而在vector size大于7时报错,很困扰我。 感谢任何回复。
在 Visual Studio 中测试您的代码表明 CompareA_ptr
没有定义 严格的弱排序 作为 comparator 的要求。这会导致未定义的行为。
罪魁祸首似乎是
return x->ranking_score_ >= y->ranking_score_;
其中 >=
应更改为 >
return x->ranking_score_ > y->ranking_score_;