Этот документ говорит, что std::list
неэффективен:
std:: list - крайне неэффективный класс, который редко бывает полезен. Он выполняет распределение кучи для каждого элемента, вставленного в него, поэтому имеет чрезвычайно высокий постоянный коэффициент, особенно для небольших типов данных.
Комментарий: это к моему удивлению. std::list
является двусвязным списком, поэтому, несмотря на его неэффективность в построении элементов, он поддерживает вставку/удаление в O (1) сложности времени, но эта функция полностью игнорируется в этом цитируемом параграфе.
Мой вопрос: Скажем, мне нужен последовательный контейнер для однородных элементов небольшого размера, и этот контейнер должен поддерживать элемент insert/delete в O (1) и не нужен произвольный доступ (хотя поддержка произвольного доступа хорошая, это не обязательно здесь). Мне также не нужен высокий постоянный коэффициент, введенный распределением кучи для каждой конструкции элемента, по крайней мере, когда число элементов невелико. Наконец, итераторы должны быть аннулированы только тогда, когда элемент соответствующий удален. По-видимому, мне нужен пользовательский класс контейнера, который может (или может быть) быть вариантом двусвязного списка. Как я должен конструировать этот контейнер?
Если вышеупомянутая спецификация не может быть достигнута, возможно, у меня должен быть пользовательский распределитель памяти, скажем, распределитель указателей bump? Я знаю, что std::list
принимает распределитель как свой второй аргумент шаблона.
Изменить: я знаю, что я не должен слишком беспокоиться об этой проблеме, с инженерной точки зрения - достаточно быстро достаточно. Это просто гипотетический вопрос, поэтому у меня нет более подробного варианта использования. Не стесняйтесь ослаблять некоторые из требований!
Edit2: Я понимаю, что два алгоритма сложности O (1) могут иметь совершенно иную производительность из-за разницы в их постоянных факторах.