Есть несколько проблем с вашим кодом, но основная заключается в том, что вы используете пользовательский компаратор для наборов, но не для вызова функции std::set_intersection
. Эта функция также должна сравнивать элементы и, конечно, должна сравнивать их с одним и тем же компаратором.
Использование:
struct cmp
{
bool operator()(int* a, int* b) const { return *a < *b; };
};
using stupid_set = set<int*, cmp>;
и
set_intersection(
s0.begin(), s0.end(),
s1.begin(), s1.end(),
std::inserter(i, i.begin()),
cmp{} // custom comparator used for sets
);
Всего живого демо здесь: https://godbolt.org/z/OAr3xV.
Обратите внимание, что если вы опустите компаратор, std::set_intersection
будет использовать operator<
для заданных элементов, и эта операция будет как правило, неопределено для указателей .
Если вы действительно хотите сравнивать указатели, а не целочисленные значения, на которые они указывают, вам нужно использовать std::less
, так как это определяет порядок даже для указателей в целом:
struct cmp
{
bool operator()(int* a, int* b) const { return std::less<int*>{}(a, b); };
};
Опять же, вам нужно передать этот компаратор и std::set_intersection
.
Демонстрационная версия: https://godbolt.org/z/tLdfqn.