Я пытаюсь понять, как thrust::set_intersection
работает, но из результатов моего теста я еще больше запутался в том, что делает эта функция.
Вот несколько примеров:
const int size1 = 5;
const int size2 = 5;
int A1[size1] = { 2, 3, 4, 5, 6 };
int A2[size2] = { 1, 2, 3, 4, 5 };
int *result = new int[1000];
int *result_end = thrust::set_intersection(A1, A1 + size1, A2, A2 + size2, result, thrust::less<int>());
возвращается 2, 3, 4, 5
thrust::equal_to<int>()
возвращается 2, 3, 4, 5, 6
thrust::greater<int>()
ничего не возвращает
Я понимаю, что по умолчанию set_intersection
согласен ли я с результатом, но для любого другого примера я полностью потерян, откуда пришел результат? Или как это было рассчитано?
Известно, как работает этот алгоритм? Может кто-нибудь объяснить это?
РЕДАКТИРОВАТЬ:
Моя цель — 2 набора кортежей (скажем, размера 2):
A={(1, 1), (2, 2), (3, 3)}
B={(0, 2), (2, 2), (3, 3)}
Поэтому я хочу определить оператор на кортежи, как>< который возвращает все элементы, которые удовлетворяют оператору:
><
определяется как a.first > b.first && a.second < b.second
поэтому ответ только A [0] и B [0].
Таким образом, вы не можете достичь этого с set_intersection
право?
РЕДАКТИРОВАТЬ ответ:
Неважно, я нашел ответ Вот по этим правилам такой оператор не будет оператором «Строгого слабого порядка».
По двум входным наборам нужно отсортировать по последнему аргументу, компаратору.
В первом примере они есть, и функция работает правильно.
Наборы не отсортированы в соответствии с thrust::greater<int>()
, Поскольку предварительные условия не выполнены, функция не может выполнять свою работу.
thrust::equal_to<int>()
даже не действительный компаратор.
Других решений пока нет …