Удаление данных в контейнере STL

Оригинальная ссылка: http://www.cnblogs.com/mingzhang/p/10857646.html

СТЛ разделить на две категории в зависимости от контейнера для хранения, один хранится в виде массива с помощью контейнера (например: вектор, Deque), а другой хранится в виде дискретного узла контейнеров (например: список, набор, карта). При использовании метода стирания, чтобы удалить элемент отметить некоторые проблемы.

 

1.list, набор, контейнер карты

     Может использоваться в качестве таковых в списке использования, установить или удалить некоторые элементы маршрутные карты:

 

1,1 правильная формулировка 1

Скопировать код
1 станд :: Список <Int> Список; 
 2 станд :: Список <Int> :: итератор itList; 
 3 для (itList = List.begin (!); ItList = list.end ();) 
 4 { 
 5 , если (WillDelete (* itList)) 
 6 { 
 7 itList = List.erase (itList); 
 8} 
 9 еще 
10 itList ++; 
11}
Скопировать код
 

1.2 правильная формулировка 2

Скопировать код
1 станд :: Список <Int> Список; 
 2 станд :: Список <Int> :: итератор itList; 
 3 для (itList = List.begin (!); ItList = list.end ();) 
 4 { 
 5 , если (WillDelete (* itList)) 
 6 { 
 7 List.erase (itList ++); 
 8} 
 9 еще 
10 itList ++; 
11}
Скопировать код

1.3 Ошибка записи 1

Скопировать код
1 станд :: Список <Int> Список; 
2 станд :: Список <Int> :: итератор itList; 
3 для (itList = List.begin (); itList = list.end (!); ItList ++) , 
4 { 
5 , если (WillDelete (* itList)) 
6 { 
7 List.erase (itList); 
8} 
9}
Скопировать код
 

1.4 Ошибка записи 2

Скопировать код
1 станд :: Список <Int> Список; 
 2 станд :: Список <Int> :: итератор itList; 
 3 для (itList = List.begin (!); ItList = list.end ();) 
 4 { 
 5 , если (WillDelete (* itList)) 
 6 { 
 7 itList = List.erase (++ itList); 
 8} 
 9 еще 
10 itList ++; 
11}
Скопировать код
 

1.5 Анализ

Надлежащее использование Метод 1: стереть возвращаемое значение , чтобы получить положение следующего элемента
надлежащего использования 2: сначала использовать «+» перед вызовом метода стирания , чтобы получить положение следующего элемента
неправильного использования 1: вызвать метод стирания после использования «++» , чтобы получить расположение следующего элемента, из - за после вызова метода удаления, положение элемента было удалено, если в таком положении , чтобы получить следующие по старому адресу, происходит исключение.
Неправильный Способ 2: То же самое, что и выше.

2. Вектор, Deque контейнер

При использовании вектора, Deque траверсе удаления элементов, можно также удалить возвращаемое значение, чтобы получить положение следующего элемента:

2.1 правильная формулировка

Скопировать код
1 станд :: вектор <Int> больше; 
 2 станд :: вектор <Int> :: итератор itVec; 
 3 для (itVec = Vec.begin (!); ItVec = Vec.end ()) 
 4 { 
 5 , если (WillDelete (* itVec)) 
 6 { 
 7 itVec = Vec.erase (itVec); 
 8} 
 9 еще 
10 itList ++; 
11}
Скопировать код

2,2 Примечание

Обратите внимание , смысл: вектор, Deque не нравится, как над «надлежащим использованием 2» для траверс удалены. Пожалуйста , обратитесь к статье Причины Эффективного STL 9. В следующем отрывке:

1) Для ассоциативных контейнеров (например, карты, набора, Multimap, мультинабор), удалить текущий итератор, только текущий итератора потерпит неудачу, до тех пор, как стирание, текущий итератора может быть увеличен. Это происходит потому, что карта, как контейнер, используя красно-черное дерево реализуется, вставка, удаление узла не будет влиять на другие узлы.

 

Скопировать код
1 для (! ITER = cont.begin (); это = cont.end ();) 
2 { 
3 (* ИТЭР) -> йоЗотеЬЫпд (); 
4 , если (shouldDelete (* ITER)) 
5 cont.erase (ITER ++); 
6 еще 
7 ++ ИТЭР; 
8}
Скопировать код

 

Поскольку ИТЭР прошел метод стирания является копией, ИТЭР ++ будет указывать на следующий элемент.
2) Для контейнеров последовательности (например, вектор, Deque), удалить все элементы текущего итератора итератора позже недоступны. Это происходит потому , что VETOR, Deque использует непрерывное выделение памяти, что приводит удалить элемент позади всех элементов будет перемещаться на одну позицию вперед. Некоторый метод стирания может вернуть следующий действительный итератор.

Скопировать код
1 для (! ITER = cont.begin (); ИТЭР = cont.end ();) 
2 { 
3 (* его) -> йоЗотеЬЫпд (); 
4 , если (shouldDelete (* ITER)) 
5 ITER = cont.erase (ITER); 
6 еще 
7 ++ ИТЭР; 
8}
Скопировать код

3) Для получения списка, он не является непрерывным использованием распределения памяти, и способ его стирания также возвращает следующий действительный итератор, поэтому может быть использован вышеуказанные два метод.

отказ 3. итератора

3,1 вектор

Внутренние структуры данных: массив.
Каждый элемент произвольного доступа, требуемое постоянное время.
Кроме того или удаление времени независимо от количества элементов , необходимых для конечных элементов, время , необходимое для добавления или удаления количества элементов с линейным изменением в начале или в середине элемента.
Динамически увеличить или уменьшить элемент, управление памятью автоматически, но программист может использовать резервные) функции членов (для управления памятью.
вектор итератора , когда память перераспределяется на провал (элемент больше не то же самое , как он указывает , до и после операции). Когда над емкостью () - когда размер () элементы , вставленные в вектор, память будет перераспределена, все итератора потерпит неудачу, в противном случае, итератор указывает на любой элемент текущего элемента в будущем не удастся. При удалении элемента, выберите любой элемент элемент должен быть удален после того, как итератор потерпит неудачу.

3,2 и

Внутренние структуры данных: массив.
Каждый элемент произвольного доступа, требуемое постоянное время.
Добавление элементов в начале и в конце времени , необходимого независимо от количества элементов, время , необходимое , чтобы добавить или удалить количество элементов изменяется линейно с промежуточным элементом.
Динамически увеличить или уменьшить элемент, управление памятью автоматически, функции - члены , не предусмотренные для управления памятью.
Любой элемент будет увеличиваться провалом итераторов дека. Удаление элементов итератор потерпит неудачу в середине деки. Когда голова Deque или хвост удаления элементов, только элемент итератор не удается.

3.3 список

Внутренние структуры данных: кольцевой двунаправленный связанный список.
Вы не можете получить доступ к случайному элементу.
Двухсторонний ВТП.
Время , чтобы добавить или удалить в начале, середине и элементы конца в любом месте требуется постоянен.
Элементы могут быть динамически увеличивать или автоматически уменьшается, управление памятью.
Не увеличивать любой отказ элемента итератора. При удалении элемента, в дополнение к указывая на текущий элемент должен быть удален итераторы, другие итераторы не подведет.

3,4 SLIST

Внутренние структуры данных: один-полосной связанный список а.
Не двухсторонний обход, только траверс спереди назад.
Другие функции , аналогичные тем же список.

3,5 стек

Адаптер, который может преобразовать любой тип контейнера последовательности стеки , как правило , используются в качестве опоры для последовательности контейнера Deque.
Элементы могут продолжаться только в первом из (ЛИФО).
Вы не можете пройти весь стек.

3,6 очереди

Адаптер, который может представлять собой любой тип контейнера, преобразуется в последовательность очереди , как правило , используются в качестве опоры для последовательности контейнера Deque.
Элементы могут только ФИФО (FIFO).
Вы не можете пройти всю очередь.

3,7 priority_queue

Адаптер, который может преобразовывать любой тип контейнера представляет собой последовательность приоритетной очереди, как правило , используются в качестве основного вектора хранения.
Может получить доступ только первый элемент, вы не можете пройти весь priority_queue.
Первый элемент всегда является элементом самого высокого приоритета.

3,8 набор

Ключи и значения равны.
Уникальный.
Элементы по умолчанию в порядке возрастания.
Если итератор указывает элемент удаляется, итератор не удается. Любое увеличение в других операционных удаления элементов не вызывает отказ итераторов.

3,9 мультимножеством

Ключ не является уникальным.
Другие функции одного и того же набора.

3,10 hash_set

По сравнению с набором, она содержит элементы не обязательно упорядоченные, но в соответствии с используемой хэш - функции в рассылке, она может обеспечить более высокую скорость поиска (конечно с хэш - функцию , связанную).
Другие функции одного и того же набора.

3,11 hash_multiset

Ключ не является уникальным.
Другие особенности и hash_set же.

3.12 Карта

Уникальный.
ключевые элементы по умолчанию В в порядке возрастания.
Если итератор указывает элемент удаляется, итератор не удается. Любое увеличение в других операционных удаления элементов не вызывает отказ итераторов.

3,13 MultiMap

Ключ не является уникальным.
Другие характеристики и та же карта.

3,14 hash_map

По сравнению с картой, не обязательно ключевые элементы внутри рода ценности, но в соответствии с используемой хэш - функции в задании, он может обеспечить более высокую скорость поиска (конечно же с хэш - функции).
Другие характеристики и та же карта.

3.15 hash_multimap

Ключ не является уникальным.
Другие особенности и hash_map же.

Воспроизводится в: https: //www.cnblogs.com/mingzhang/p/10857646.html

рекомендация

отblog.csdn.net/weixin_30642561/article/details/94998364