В std :: list, сама вставка и удаление занимают время в O (1), что означает очень быстро , и, прежде всего, означает скорость, которая не зависит от числа элементы в списке.
В std :: set вставка и удаление занимают время в O (log (N)), что означает немного медленнее, если в наборе содержится много элементов. N в выражении O (log (N)) означает количество элементов. Grosso modo, это означает, что время, затрачиваемое на операцию, отчасти пропорционально логарифму (здесь значение не имеет значения, поскольку оно эквивалентно умножению на константу, которая игнорируется при анализе теоретического алгоритма) количества элементов в наборе.
Но важно учитывать время, затрачиваемое на поиск удаляемого элемента. Если вам необходимо выполнить поиск в контейнере для удаляемого элемента, что, скорее всего, имеет место, тогда для std :: list потребуется довольно много времени для этого поиска, который будет в O (N) (что означает не fast , потому что время прямо пропорционально количеству элементов, а не его логарифму), в то время как для поиска std :: set потребуется время в O (log N).
Также обратите внимание, что эти теоретические анализы становятся абсолютно недействительными для контейнеров с очень небольшим количеством элементов, и в этом случае скрываемые ими константы умножения становятся более важными, чем семейство функций времени, на котором оно сосредоточено.
Чтобы сделать его коротким:
std :: list => Замедляет поиск удаляемого элемента; быстрее удалить его.
std :: set => Ускорить поиск удаляемого элемента; менее быстро, чтобы удалить его.
Но для всей операции и для большого числа элементов std :: set лучше.
Вам также следует рассмотреть возможность использования хеш-таблиц . Хорошие реализации этого доступны в Boost, Qt или C ++ 0x. Они выполняют все эти операции во времени, стремясь к O (1) (что означает очень очень быстро ).