По крайней мере, в тех реализациях, на которые я смотрел, реализация довольно проста - что-то в этом общем порядке:
template <class inIt, class outIt>
outIt set_intersection(inIt start1, inIt end1, inIt start2, inIt end2, outIt out) {
while (start1 != end1 && start2 != end2) {
if (*start1 < *start2)
++start1;
else if (*start2 < *start1)
++start2;
else { // equal elements.
*out++ = *start1;
++start1;
++start2;
}
}
return out;
}
Конечно, я просто набираю это сверху моегоhead - он, вероятно, даже не будет компилироваться и, конечно, не будет педантично правильным (например, вероятно, следует использовать функцию сравнения вместо непосредственного использования operator<
и иметь другой параметр шаблона, чтобы start1 / end1 отличалсявведите с начала2 / конца2).
Однако с алгоритмической точки зрения я бы предположил, что большинство реальных реализаций в значительной степени такие же, как указано выше.