Очистка std::list с удалением объектов
Суть в том, что я циклически создаю объекты и помещаю их в list. Но как мне потом средствами самого list удалить все объекты из памяти? Или прийдётся ето делать вручную?
Вывод программы такой:
MyClass::MyClass(1) MyClass::MyClass(2) MyClass::MyClass(3) MyClass::MyClass(4)
деструкторы класса не срабатывают. Может, я не правильно понимаю документацию, но здесь http://www.cplusplus.com/reference/list/list/clear/ написано:
All the elements in the list container are dropped: their destructors are called, and then they are removed from the list container, leaving it with a size of 0.
почему тогда в моём случае деструкторы не вызываются?
Как очистить list c
Приветствую,
возникла проблема с удаление елемента списка.
list int> c1; list int>::iterator c1_Iter; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) < //что-то делаем с c1_Iter и поняли что нужно удалить этот элемент, но чтобы цикл продолжился >
c1.erase(c1_Iter); всё рушит и я почти понял почему
Подскажите как правильно удалить, пока приходит на ум только создать второй список на удаление и после цикла for все удалить.
Re: erase в std:list
От: | Bell | |
Дата: | 03.05.06 15:16 | |
Оценка: | 1 (1) |
Здравствуйте, RSNT, Вы писали:
RSN>Приветствую,
RSN>возникла проблема с удаление елемента списка.
RSN> list int> c1; RSN> list int>::iterator c1_Iter; RSN>for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) RSN>< RSN>//что-то делаем с c1_Iter и поняли что нужно удалить этот элемент, но чтобы цикл продолжился RSN>> RSN>
RSN>c1.erase(c1_Iter); всё рушит и я почти понял почему
RSN>Подскажите как правильно удалить, пока приходит на ум только создать второй список на удаление и после цикла for все удалить.
list int> c1; list int>::iterator c1_Iter = c1.begin(), e = c1.end(); while(c1_Iter != e) < if(/*нужно удалить*/) c1_Iter = c1.erase(c1_Iter); else ++c1_Iter; >
Или же использовать метод списка remove_if.
Любите книгу — источник знаний (с) М.Горький
Re[2]: erase в std:list
От: | denisku |
Дата: | 04.05.06 10:48 |
Оценка: |
Здравствуйте, Bell, Вы писали:
B>
B>list int> c1; B> list int>::iterator c1_Iter = c1.begin(), e = c1.end(); B>while(c1_Iter != e) B> < B>if(/*нужно удалить*/) B> c1_Iter = c1.erase(c1_Iter); B> else B> ++c1_Iter; B>> B>
а вызов erase() не сделает e невалидным? имхо, надо бы сделать
while(c1_Iter != c1.end())
Извините за потраченный траффик..
Re[3]: erase в std:list
От: | FreshMeat | http://www.rsdn.org |
Дата: | 04.05.06 10:57 | |
Оценка: |
Здравствуйте, denisku, Вы писали:
D>а вызов erase() не сделает e невалидным?
Нет. Добавление/удаление элементов списка не влияет на валидность итераторов (видимо, с вектором спутал)
http://gzip.rsdn.ru/article/cpp/stl.xml#EMVBG
Автор(ы): Александр Степанов, Менг Ли
Список (List)
.
erase делает недействительными только итераторы и ссылки для стёртых элементов. Стирание единственного элемента — операция постоянного времени с единственным вызовом деструктора T. Стирание диапазона в списке занимает линейное время от размера диапазона, а число вызовов деструктора типа T точно равно размеру диапазона.
Хорошо там, где мы есть! 🙂
Re[4]: erase в std:list
От: | saddva |
Дата: | 04.05.06 12:54 |
Оценка: |
Здравствуйте, FreshMeat, Вы писали:
FM>Здравствуйте, denisku, Вы писали:
D>>а вызов erase() не сделает e невалидным?
FM>Нет. Добавление/удаление элементов списка не влияет на валидность итераторов (видимо, с вектором спутал)
FM>http://gzip.rsdn.ru/article/cpp/stl.xml#EMVBG
Автор(ы): Александр Степанов, Менг Ли
FM>Список (List)
FM>.
FM>erase делает недействительными только итераторы и ссылки для стёртых элементов. Стирание единственного элемента — операция постоянного времени с единственным вызовом деструктора T. Стирание диапазона в списке занимает линейное время от размера диапазона, а число вызовов деструктора типа T точно равно размеру диапазона.
А если удаляется последний элемент списка? Даже в этом случае e останется валидным?
Re[5]: erase в std:list
От: | FreshMeat | http://www.rsdn.org |
Дата: | 04.05.06 13:06 | |
Оценка: |
Здравствуйте, saddva, Вы писали:
S>А если удаляется последний элемент списка? Даже в этом случае e останется валидным?
Да. end() у списка сделан вообще достаточно хитро. Сырцы реализаций STL не копал, но есть сильное подозрение (следующее из логики работы класса), что end() фиксируется в момент создания списка и не изменяется все время жизни листа.
Хорошо там, где мы есть! 🙂
Re: erase в std:list
От: | rg45 |
Дата: | 05.05.06 14:00 |
Оценка: |
> list int> c1; > list int>::iterator c1_Iter; > > for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) > < >//что-то делаем с c1_Iter и поняли что нужно удалить этот элемент, но чтобы цикл продолжился > > > >
>
> c1.erase(c1_Iter); всё рушит и я почти понял почему
>
> Подскажите как правильно удалить, пока приходит на ум только создать второй список на удаление и после цикла for все удалить.
При помощи вспомогательного итератора проблема решается достаточно просто:
list int> c1; list int>::iterator c1_Iter, c1_Iter2; for ( c1_Iter = c1_Iter2 = c1.begin( ); c1_Iter != c1.end( ); c1_Iter = c1_Iter2) < ++c1_Iter2; //что-то делаем с c1_Iter. c1.erase(c1_Iter); >
Как очистить такую коллекцию?
все заполненное до этого появляется там ЗАНОВО.
а ведь этот метод нью должен создать новый экземпляр!
как можно удалить все элементы — так чтобы можно было начать заполнять ее ЗАНОВО??
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как проще можно очистить коллекцию List в зависимости от предиката (без присваивания)?
Например есть List из объектов "Человек". Нужно очистить от всех объектов у которых возраст < 18.
Как быстро очистить коллекцию?
Для быстрой очистки массива есть команда Erase массив Есть ли нечто подобное для коллекции?
Очистить коллекцию
Друзья, ХЕЛП. не могу очистить коллекцию, она все пополняется и пополняется, и как с коллекции.
как создать вот такую или примерно такую окошку?
как создать вот такую или примерно такую окошку?
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
List.Clear() не помогает?
Регистрация: 18.11.2009
Сообщений: 676
да. уже разобрался и сам. помогло. удалил бы тему- да что то тут нету такой клавиши(
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
Анарион, если первая переменная была объявлена глобально, а вы создаете потом вторую с таким же именем в каком-либо методе, то глобальная не будет очищена. Чтобы инициализировать заново надо писать не
ListListstring>> answers = new ListListstring>>();
answers = new ListListstring>>();
тогда, если с того места, в котором вы пишете повторную инициализацию, доступна та глобальная переменная — она проинициализируется заново, а не создастся вторая с таким же именем, но локальная.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Дано число R и коллекцию размера N. Преобразовать коллекцию, заменив все ее положительные элементы на число R
Всем доброго времени суток. Вот такая задачка. Дано число R и коллекция размера N.
Как забиндить коллекцию
Всем привет! помогите со следующим вопросом. Изучаю C# решил работать с WPF, Entity Framework.
Как вернуть коллекцию?
формирую коллекцию private string Читать_коллекцию_кодификаторов() < .
Как разбить коллекцию?
Доброе время суток! Столкнулся со следующей проблемой, ситуация заключается в следующем. У меня.
Или воспользуйтесь поиском по форуму:
List: специфичные операции
List — самый популярный из всех типов коллекций в Kotlin. Он предоставляет мощный набор операций благодаря наличию доступа к элементам по индексу.
Получение элементов по индексу
Списки поддерживают все стандартные операции для получения элементов: elementAt() , first() , last() и другие, перечисленные в разделе Выбор одного элемента. Списки характерны тем, что предоставляют доступ к элементам по индексу, поэтому именно по индексу проще всего получить необходимый элемент. Это осуществляется с помощью функции get() , которая принимает индекс в качестве аргумента. Также можно использовать сокращённый синтаксис — [index] .
Если размер списка меньше указанного индекса, то будет выброшено исключение. Есть ещё две функции, которые помогут этого избежать:
- getOrElse() — позволяет вам предоставить функцию для вычисления значения по умолчанию. Если по указанному индексу элемент не был найден, то будет возвращён результат вычисления этой функции.
- getOrNull() — возвращает null в качестве значения по умолчанию.
fun main() < val numbers = listOf(1, 2, 3, 4) println(numbers.get(0)) // 1 println(numbers[0]) // 1 //numbers.get(5) // exception! println(numbers.getOrNull(5)) // null println(numbers.getOrElse(5, )) // 5 >
Получение части списка
Помимо обычных операций для Выборки элементов, списки предоставляют функцию subList() , которая возвращает представление указанного диапазона элементов в виде списка. Таким образом, если элемент исходной коллекции будет изменён, то он также изменится и в списке, созданном с помощью функции subList() , и наоборот.
fun main() < val numbers = (0..13).toList() println(numbers.subList(3, 6)) // [3, 4, 5] >
Поиск позиции элемента
Линейный поиск
В любом списке вы можете найти позицию элемента с помощью функций indexOf() и lastIndexOf() . Они возвращают первую и последнюю позицию элемента, равного заданному аргументу. Если таких элементов нет, то обе функции возвращают -1 .
fun main() < val numbers = listOf(1, 2, 3, 4, 2, 5) println(numbers.indexOf(2)) // 1 println(numbers.lastIndexOf(2)) // 4 >
Также существуют две функции, которые принимают предикат и ищут соответствующие ему элементы:
- indexOfFirst() — возвращает индекс первого элемента, соответствующего заданному предикату или -1 , если таких элементов нет.
- indexOfLast() — возвращает индекс последнего элемента, соответствующего заданному предикату или -1 , если таких элементов нет.
fun main() < val numbers = mutableListOf(1, 2, 3, 4) println(numbers.indexOfFirst < it >2>) // 2 println(numbers.indexOfLast < it % 2 == 1>) // 2 >
Бинарный поиск в отсортированном списке
Ещё один способ поиска элементов в списке – бинарный поиск. Он работает значительно быстрее остальных встроенных функций поиска, но для его использования требуется, чтобы список был отсортирован по возрастанию в соответствии с определённым порядком: естественным или любым другим, указанным в параметре функции. В противном случае результат не будет определён.
Чтобы найти элемент в отсортированном списке, вызовите функцию binarySearch() , передав ей искомое значение в качестве аргумента. Если такой элемент существует, функция вернёт его индекс; в противном случае она вернёт (-insertionPoint — 1) , где insertionPoint — это индекс, в который этот элемент должен быть вставлен, чтобы список оставался отсортированным. Если существует более одного элемента с указанным значением, функция может вернуть любой из их индексов.
Вы также можете указать диапазон индексов для поиска: в этом случае функция выполняет поиск только между двумя предоставленными индексами.
fun main() < val numbers = mutableListOf("one", "two", "three", "four") numbers.sort() println(numbers) // [four, one, three, two] println(numbers.binarySearch("two")) // 3 println(numbers.binarySearch("z")) // -5 println(numbers.binarySearch("two", 0, 2)) // -3 >
Бинарный поиск с Comparator
Если элементы списка не являются Comparable , вы должны предоставить Comparator , который будет использован в бинарном поиске. Список должен быть отсортирован по возрастанию в соответствии с этим Comparator . Давайте посмотрим на пример:
data class Product(val name: String, val price: Double) fun main() < val productList = listOf( Product("WebStorm", 49.0), Product("AppCode", 99.0), Product("DotTrace", 129.0), Product("ReSharper", 149.0)) println( productList .binarySearch(Product("AppCode", 99.0), compareBy < it.price >.thenBy < it.name >) ) // 1 >
В данном примере есть:
- список из экземпляров класса Product , которые не являются Comparable .
- Comparator , который определяет порядок: продукт p1 предшествует продукту p2 , если цена p1 меньше, чем цена p2 . Итак, имея список, отсортированный по возрастанию в соответствии с этим порядком, мы используем binarySearch() , чтобы найти индекс указанного Product .
Пользовательские компараторы также удобны, когда для сортировки списка используется порядок, отличный от естественного, например, без учета регистра для элементов String .
fun main() < val colors = listOf("Blue", "green", "ORANGE", "Red", "yellow") println(colors.binarySearch("RED", String.CASE_INSENSITIVE_ORDER)) // 3 >
Бинарный поиск с функцией сравнения
Бинарный поиск с функцией сравнения (comparison) позволяет находить элементы без предоставления явных значений для поиска. Вместо этого он принимает элементы функции сравнения, преобразованные в Int , и ищет элемент, для которого функция возвращает ноль. Список должен быть отсортирован по возрастанию в соответствии с порядком, предоставленным функцией; другими словами, возвращаемые функцией значения должны расти от одного элемента списка к следующему.
import kotlin.math.sign data class Product(val name: String, val price: Double) fun priceComparison(product: Product, price: Double) = sign(product.price - price).toInt() fun main() < val productList = listOf( Product("WebStorm", 49.0), Product("AppCode", 99.0), Product("DotTrace", 129.0), Product("ReSharper", 149.0)) println(productList.binarySearch < priceComparison(it, 99.0) >) // 1 >
Бинарный поиск как с компаратором, так и с функцией сравнения может выполняться для диапазонов списков.
Операции записи
В дополнение к изменяющим коллекцию операциям, которые описаны в разделе Операции записи коллекций, изменяемые списки поддерживают операции записи, характерные только для списков. Эти операции используют индекс для доступа к элементам, что расширяет возможности для изменения списка.
Добавление элементов
Чтобы добавить элементы в определённую позицию в списке, используйте add() и addAll() , которым в качестве аргумента передайте позицию для вставки элемента. Все элементы, которые идут после указанной позиции, будут смещены вправо.
fun main() < val numbers = mutableListOf("one", "five", "six") numbers.add(1, "two") numbers.addAll(2, listOf("three", "four")) println(numbers) // [one, two, three, four, five, six] >
Обновление элементов
Списки также предоставляют функцию для замены элемента в заданной позиции — set() , у которой есть операторная форма [] . set() не меняет индексы других элементов.
fun main() < val numbers = mutableListOf("one", "five", "three") numbers[1] = "two" println(numbers) // [one, two, three] >
Функция fill() просто заменяет все элементы коллекции на указанное значение.
fun main() < val numbers = mutableListOf(1, 2, 3, 4) numbers.fill(3) println(numbers) // [3, 3, 3, 3] >
Удаление элементов
Чтобы удалить элемент из определённой позиции списка, используйте функцию removeAt() , передав ей в качестве аргумента эту позицию. Все индексы элементов, которые идут после удаляемого, будут уменьшены на единицу.
fun main() < val numbers = mutableListOf(1, 2, 3, 4, 3) numbers.removeAt(1) println(numbers) // [1, 3, 4, 3] >
Сортировка
В разделе Сортировка коллекций описаны операции, которые возвращают элементы коллекции в определённом порядке. Для изменяемых списков в стандартной библиотеке есть аналогичные функции-расширения, выполняющие сортировку, но вместо возврата нового отсортированного списка они изменяют порядок элементов в исходном списке.
Подобные функции сортировки названы похожими именами, но без суффикса ed/d :
- sort* вместо sorted* в именах всех функций сортировки: sort() , sortDescending() , sortBy() и так далее.
- shuffle() вместо shuffled() .
- reverse() вместо reversed() .
Функция asReversed() , вызываемая к изменяемому списку, возвращает другой изменяемый список, который является перевёрнутым представлением исходного списка. Вместе с изменением этого представления вы изменяете и исходный список.
В следующем примере показаны функции сортировки для изменяемых списков:
fun main() < val numbers = mutableListOf("one", "two", "three", "four") numbers.sort() println("Sort into ascending: $numbers") // Sort into ascending: [four, one, three, two] numbers.sortDescending() println("Sort into descending: $numbers") // Sort into descending: [two, three, one, four] numbers.sortBy < it.length >println("Sort into ascending by length: $numbers") // Sort into ascending by length: [two, one, four, three] numbers.sortByDescending < it.last() >println("Sort into descending by the last letter: $numbers") // Sort into descending by the last letter: [four, two, one, three] numbers.sortWith(compareBy < it.length >.thenBy < it >) println("Sort by Comparator: $numbers") // Sort by Comparator: [one, two, four, three] numbers.shuffle() println("Shuffle: $numbers") // Shuffle: [one, two, three, four] numbers.reverse() println("Reverse: $numbers") // Reverse: [four, three, two, one] >
© 2015—2023 Open Source Community