Контейнеры STL: liste. partie 4

Noter cet article




list c++, лист с++, La STL de контейнеры C , Standard Template Library, c ++ conteneur, двунаправленный список с++В третьей части уроков о контейнерах STL, мы закончили рассмотрение vecteurs, disons, type vecteur<flotte> как эквивалента массива вещественных чисел. Для таких «массивов» очень быстро осуществляются операции доступа к элементу (чтение-запись) по индексу и вставка-удаление элемента в конец vecteur. Гораздо хуже (по эффективности) выполняются операции вставки-удаления элемента где-то в середине вектора, или перемещение элемента из одной позиции в другую.

par exemple, в векторе размером 15 операция перемещения 10-го элемента в позицию 2 потребует:

  • запомнить в промежуточной переменной 10-й элемент;

  • pour tous элементов с 9-го по 2-й (в обратном порядке, возможно используя реверсный итератор) скопировать в следующую позицию (8 операций копирования);

  • сохранённый ранее в промежуточной переменной элемент скопировать в позицию 2;

Итого, для этой простой операции нам потребовалось 10 операций копирования. Каждый элемент вектора, как уже обсуждалось ранее, может представлять сбой сложно-составную структуру. И его копирование — это достаточно трудоёмкое действие.

pour “коллекций”, в которых планируются активные добавления, удаления и перемещения элементов, библиотека STL предлагает другой вид контейнера — liste doublement chaînée, liste. Для такого контейнера доступ к элементам (чтение, record) последовательный, и не такой эффективный. Зато операции добавления, удаления или изменения порядка элементов очень быстрые.

iterator liste не является итератором прямого доступа. Поэтому для него pasприменимы операции +, , +=, -=, а для контейнера pasдопустима операция индексации. Итераторы для этого контейнера перемещаются последовательно операциями ++ et.

Для иллюстрации работы с таким контейнером запишем всё ту же задачу нахождения всех простых чисел, ne dépassant pas N (для единообразия и сравнения с предыдущими вариантами):

Здесь первая половина кода (opérateur << для списка) только декоративная реализация для диагностики и удобства, а в остальной части проделывается следующее:

  • Формируется список liste<int> натуральных чисел диапазона [2…N] – lignes 19 – 22;

  • Для каждого (оставшегося) числа из всего последующего списка удаляются кратные ему элементыrangée 31;

  • И так до тех пор, пока очередное проверяемое число не превысит квадратный корень из Nrangée 26 (в теории чисел показано, что делимость можно проверять не до N-1, а до числа, превышающего корень квадратный N);

Из особенностей кода, et контейнеров list вообще, нужно обратить внимание на то, что после удаления элемента, указываемого текущим значением итератора, значение итератора становится неопределённым. Если нам нужно продолжать итерацию, то мы должны работать с копией iterator (je в показанном коде).

Выполнением кода мы можем проверить, что результаты его в точности аналогичны предыдущим вариантам. Перед запуском программы, не забудьте определить аргумент команды равный 300, как мы это делали в предыдущем уроке.
list c++, лист с++, La STL de контейнеры C , Standard Template Library, c ++ conteneur, liste doublement chaînée

Bulletin de nouvelles leçons sur la programmation:

huile

Sur huile

une expérience pratique sur le développement de logiciels 40 ans. société de logiciels internationale Global Teacher Logic. IBM Developer Works auteur permanent des publications. éditeur scientifique de l'ordinateur littérature maison d'édition "Symbole-Plus", Saint-Pétersbourg.

Laisser un commentaire

Placez le code dans les balises: <pre class="lang:c ++ décodage:true ">VOTRE CODE</pré>