Эффективный способ вставки уже упорядоченных элементов в набор - это намек на библиотеку относительно того, где будет следующий элемент. Для этого необходимо использовать версию insert
, которая принимает итератор:
std::set<int>::iterator it = mySet.end();
for (int x : input) {
it = mySet.insert(it, x);
}
С другой стороны, вы можете рассмотреть другие контейнеры. По возможности используйте std::vector
. Если количество вложений невелико по сравнению с поиском, или если все вставки происходят заранее, то вы можете построить вектор, отсортировать его и использовать lower_bound
для поиска. В этом случае, поскольку вход уже отсортирован, вы можете пропустить сортировку.
Если вставки (или удаления) происходят повсюду, вы можете рассмотреть возможность использования std::unordered_set<int>
, который имеет среднюю вставку (на элемент) O(1)
и стоимость поиска.
Для конкретного случая отслеживания небольших чисел в наборе, все из которых малы (от 34 до 75 - это небольшие числа), вы также можете рассмотреть возможность использования битов или даже простого массива bool
, в котором вы устанавливаете элементы в true
при вставке. Либо у вас будет O(n)
вставка (все элементы) и O(1)
поиск (каждый поиск), который лучше, чем набор.
Если это только часть проблемы, то я хотел бы предложить реализации связанного список ... 'O (1)' толчок, 'n' толчки = 'O (n)'. –