Я не понимаю, почему в std::flat_set и т. д. отсутствуют функции-члены слияния. Уже существует идеальный алгоритм для его реализации — std::ranges::merge. И я знаю, что, хотя де-юре временная сложность должна быть одинаковой, де-факто мы получаем накладные расходы на копирование/перемещение объектов вместо простых переназначений. И тем не менее, это могло бы сохранить API (на самом деле, та же самая мотивация была для создания фиктивного std::unordered_container::merge() для упрощения проверок профилирования). Теперь, когда API не работает и каждое появление smth.merge() должно каким-то образом обрабатываться (об этом тоже есть вопрос ниже), мы не можем просто переключиться на плоские версии.
import std;
using namespace std;
int main(){
set set1{ 0,2,4 }, set2{ 1,3,5 }; /*can be easily changed to
unordered_set and vice versa but not to flat_set*/
//...
set1.merge(set2); /*such statements will become invalid if we
switch to flat versions*/
}
Помимо ванильного любопытства, мне хотелось найти элегантный обходной путь. Пока что я вижу решение только с помощью такой глобальной функции, которой следует заменить все вызовы merge().
template requires (T t, T f) { t.merge(f); }
T & merger(T & first, T & second) {
first.merge(second);
return first;
}
template
T merger(T first, T second) {
using underlying = decltype(T().extract());
underlying buff(first.size() + second.size());
ranges::merge(first.extract(), second.extract(), buff.begin());
return T{ buff };
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... ge-support