Как очистить list c
Перейти к содержимому

Как очистить list c

Очистка 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *