std :: sort терпит неудачу на std: вектор указателей

Следующий код вылетает при сортировке вектора.

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;

struct Foo
{
int x;
// int y;
Foo() : x(0) {}
};

struct Cmp
{
bool operator() (Foo* p1, Foo *p2) const
{
if (p1->x != p2->x) return p1->x < p2->x;
// if (p1->y != p2->y) return p1->y < p2->y;
return true;
}
};

int main()
{
vector<Foo*> v;
for (int i=0; i<17; i++) // weird thing, doesn't crash if
// I put a number less than 17 !!!
{
Foo *ptr = new Foo();
if (ptr) v.push_back(ptr);
}
sort(v.begin(), v.end(), Cmp());

return 0;
}

Почему это так?

4

Решение

bool operator() (Foo* p1, Foo *p2) const
{
if (p1->x != p2->x) return p1->x < p2->x;
return true;
}

std::sort требует функции сортировки, которая создает строго-слабый порядок. это не. Это <=, что не является строго-слабым порядком. Если lhs а также rhs тогда равны comp(lhs, rhs) а также comp(rhs, lhs) должны оба вернуться ложный.

Ваша функция не делает. Таким образом, вы получаете неопределенное поведение.

22

Другие решения

Других решений пока нет …

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.