СТЛ разделить на две категории в зависимости от контейнера для хранения, один хранится в виде массива с помощью контейнера (например: вектор, 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