Как быстрее всего сравнить два множества?
Допустим, есть два вектора
std::vector<int> v1 = {1, 2, 3, 4};
std::vector<int> v1 = {1, 2, 4, 3};
Самая первая мысль, которая пришла на ум, это отсортировать и сравнить попорядку.
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
bool eq = true;
for(size_t i = 0; i < v1.size(); ++i){
if (v1[i] != v2[i]) {
eq = false;
break;
}
}
Но это оказалось медленнее, чем если написать сравнение перебором
eq = v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2] && v1[3] == v2[3] ||
v1[0] == v2[1] && v1[1] == v2[2] && v1[2] == v2[3] && v1[3] == v2[0] ||
v1[0] == v2[2] && v1[1] == v2[3] && v1[2] == v2[0] && v1[3] == v2[1] ||
v1[0] == v2[3] && v1[1] == v2[0] && v1[2] == v2[1] && v1[3] == v2[2];
Я хочу оставить это решение, но как его переписать для любого размера контейнеров?
Я пробовал циклом:
for(size_t i = 0; i < v1.size(); ++i){
bool eq = true;
for(size_t j = 0; j < v1.size(); ++j){
if (v1[j] != v1[j+1]){
eq = false;
break;
}
}
if (eq) {
// Одинаковые
}
}
Но так даже дольше, чем сортировкой. Есть ли какой-то способ "сгенерировать" сравнение перебором для любого размера? Может с помощью шаблонов?
А вообще, главный вопрос - есть ли способ еще быстрее сравнить два множества?