Контейнеры STL: lista. parte 4




Lista C ++, C ++ lista, контейнеры C ++ STL , Standard Template Library, C ++ contenitore, Lista bidirezionale con ++Nella terza parte delle lezioni dei contenitori STL, мы закончили рассмотрение vettori, diciamo, tipo vettore<galleggiante> come l'equivalente di una matrice di numeri reali. Per questi "array" molto rapidamente effettuato l'operazione per accedere all'elemento (lettura-scrittura) по индексу и вставка-удаление элемента в конец vettore. Гораздо хуже (по эффективности) выполняются операции вставки-удаления элемента где-то в середине вектора, или перемещение элемента из одной позиции в другую.

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

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

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

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

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

Дляколлекций”, в которых планируются активные добавления, удаления и перемещения элементов, библиотека STL предлагает другой вид контейнера — lista doppiamente collegata, lista. Для такого контейнера доступ к элементам (чтение, record) последовательный, и не такой эффективный. Зато операции добавления, удаления или изменения порядка элементов очень быстрые.

iteratore lista не является итератором прямого доступа. Поэтому для него nonприменимы операции +, , +=, -=, а для контейнера nonдопустима операция индексации. Итераторы для этого контейнера перемещаются последовательно операциями ++ e.

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

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

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

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

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

Из особенностей кода, e контейнеров list generalmente, нужно обратить внимание на то, что после удаления элемента, указываемого текущим значением итератора, значение итератора становится неопределённым. Если нам нужно продолжать итерацию, то мы должны работать с una copia iteratore (io codice mostrato in).

Il codice viene eseguito, possiamo controllare, che i risultati esattamente simile alle versioni precedenti. Prima di avviare il programma, non dimenticare di definire i comandi uguali all'argomentazione 300, come abbiamo fatto nella precedente lezione.
Lista C ++, C ++ lista, контейнеры C ++ STL , Standard Template Library, C ++ contenitore, lista doppiamente collegata

Newsletter nuove lezioni sulla programmazione:


Accetto di ricevere messaggi da purecodecpp.com sulla mia e-mail

data
pagina
Контейнеры STL: lista (lista doppiamente collegata). parte 4
valutazione
5
olio

Di olio

esperienze pratiche circa lo sviluppo del software 40 anni. Maestro globale Logic società di software internazionale. IBM Developer funziona autore permanente di pubblicazioni. redattore scientifico del computer casa editrice letteratura "Simbolo-Plus", San Pietroburgo.

Lascia un Commento

Inserire il codice nei tag: <pre class="lang:C ++ decodifica:true ">IL TUO CODICE</pre>