По словам Бьярна Страуструпа слайды от его Going Native 2012 с основным докладом, вставка и удаление в std::list
ужасно неэффективны на современном оборудовании:
Список векторных ударов массово для вставки и удаления
Если это действительно так, то какие варианты использования оставлены для std::list
? Разве это не должно быть устаревшим тогда?
Вектор и список решают разные задачи. Список обеспечивает гарантию того, что итераторы никогда не станут недействительными при вставке и удалении других элементов. Вектор не дает такой гарантии.
Это не все о производительности. Так что ответ — нет. Список не должен быть устаревшим.
редактировать Кроме того, C ++ не предназначен для работы исключительно на «современном оборудовании». Предполагается, что он будет полезен для гораздо более широкого спектра оборудования, чем это. Я программист в финансовой индустрии и использую C ++, но другие области, такие как встраиваемые устройства, программируемые контроллеры, машины, работающие на сердце, и многие другие, так же важны. Язык C ++ не должен быть разработан исключительно с учетом потребностей определенных доменов и производительности определенных классов оборудования. Просто так я может не использовать список, не означает, что он не должен использоваться в языке.
Превосходит ли вектор список или нет, также зависит от типа элементов. Например, для int
вектор элементов действительно очень быстрый, так как большая часть данных помещается в кэш-память ЦП, и для копирования данных можно использовать SIMD-инструкции. Таким образом, сложность вектора O (n) не оказывает большого влияния.
Но как насчет более крупных типов данных, где копирование не переводится в потоковую операцию, а вместо этого данные должны извлекаться повсюду? Кроме того, как насчет оборудования, которое не имеет больших кэшей ЦП и, возможно, также не содержит SIMD-инструкций? C ++ используется не только на современных компьютерах и рабочих станциях. Об устаревшем std :: list не может быть и речи.
В этой презентации Stroustrup говорит о том, что прежде чем выбрать std :: list для своих данных, вы должны убедиться, что это правильный выбор для ваша конкретная ситуация. Другими словами, эталон и профиль. Это определенно не говорит, что вы должны всегда выбирать std :: vector.
Нет, и особенно не на основе одного конкретного графика. Есть случаи, когда список будет работать лучше, чем вектор. Увидеть: http://www.baptiste-wicht.com/2012/12/cpp-benchmark-vector-list-deque/
И это игнорирует разницу в производительности, как уже упоминали другие.
Суть Бьярне в этом разговоре заключалась не в том, что вы не должны использовать список. Это было то, что люди делают слишком много предположений о производительности списка, которые часто оказываются неверными. Он просто оправдывал позицию, согласно которой вектор должен всегда быть типом контейнера перехода по умолчанию, если только вы не обнаружите необходимость в производительности или других семантических характеристиках списков.
Конечно, нет. std :: list — это другая структура данных. Сравнение различной структуры данных является хорошим показателем ее свойств, преимуществ или недостатков. Но каждая структура данных имеет свои преимущества.
Посмотрите на и то и другое ссылки ниже:
http://msdn.microsoft.com/en-us/library/802d66bt.aspx
http://msdn.microsoft.com/en-us/library/9xd04bzs.aspx
Сначала прочитайте первые строки, а затем посмотрите на следующие разделы: Параметры, Замечания и Члены — Конструкторы, Typedefs, Функции-члены и Операторы.
После чтение все, вы узнаете различия между списком и вектором и быть в состоянии сравнить их, и выяснить их профи а также минусы — преимущества а также недостатки.
Кто нуждается или любит профи а также преимущества из список больше, тогда он / она использует список вместо этого, и это причина, почему список должен не быть устаревшим.
Также кто-то перестанет использовать vector и начнет использовать list, если у него возникли проблемы с минусы а также недостатки вектора, что список не иметь.
Вы узнаете, какие функции-члены и операторы и то и другое список и вектор иметь общее, какие функции-члены и операторы вектор имеет только, и какие функции-члены и операторы список имеет только.
Я прочитал эти страницы MSDN в разделах функций-членов и операторов, и заметил, что только вектор класс поддерживает at
функция-член и []
оператор, но только с другой стороны список класс поддерживает push_front
а также pop_front
функции-члены.
Вы узнаете ограничения, с которыми вам придется столкнуться при использовании только вектор, и ограничения, с которыми вам придется столкнуться при использовании только список. Если вы используете вектор, но это отсутствует что-то очень важно к тебе, но список не, тогда вы рассмотрите возможность использования списка вместо вектора, и наоборот (из списка в вектор).
Не существует чего-то совершенного. Ни за что этот вектор лучше, чем список в все. Если это правда, то список никогда не существовал в C ++ за всю историю.
Но есть список, существует, то должны быть некоторые точки, которые список лучше, чем вектор, если точно нет на графике вы показываете нам, затем в других вещах.
Может быть много лет назад программисты, которые использовали вектор только у них были трудности и проблемы, которые они должны были решить, и они получили решение, придумав класс списка и использовав его вместо вектора.
Я действительно не знаю, и, возможно, я ошибаюсь, но мне интересно, что класс списка был изобретен после что векторный класс был изобретен.
Я буду признателен вам, ребята, если вы скажете мне, правильно я или нет, и скажите мне истинный факт об этом.
Если вектор был не проблематично в некоторых моментах, тогда я не думаю, что этот список когда-либо был придуман.
Кстати об этом графике я упоминал, когда я увидел это в первый раз, прежде чем я прочитал что вы сказали об этом, я думал, что это показывает время, которое требуется для перебрать список и вектор. Я был удивлен, прочитав, что вы сказали, что это время вставки и удаления. Я думал, что вставить и удалить взять значительно меньше время итерации всей коллекции.