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

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

Как очистить карту в Go?

Я ищу что-то вроде функции c ++ .clear() для примитивного типа map .

Или лучше просто создать новую карту?

Обновление: Спасибо за ответы. Посмотрев на ответы, я понял, что иногда создание новой карты может привести к некоторой несогласованности, которой мы не хотим. Рассмотрим следующий пример:

Я имею в виду, что это все еще отличается от .clear() функции в C ++, которая очищает содержимое объекта.

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

Так что да, тебе, наверное, стоит просто сказать

Если вам действительно нужно очистить существующую карту по какой-либо причине, это достаточно просто:

В отличие от C ++, Go — это язык со сборкой мусора. Вам нужно думать о вещах немного по-другому.

Когда вы делаете новую карту

исходная карта в конечном итоге будет собрана в мусор; вам не нужно очищать его вручную. Но помните, что карты (и срезы) являются ссылочными типами; вы создаете их с помощью make() . Базовая карта будет собираться мусором только тогда, когда на нее нет ссылок. Таким образом, когда вы делаете

исходный массив не будет собираться сборщиком мусора (до тех пор, пока b не будет собран или b не будет ссылаться на что-то еще).

Манипулируем System.Drawing.Bitmap

Класс System.Drawing.Bitmap очень полезен в инфраструктуре .NET, т.к. позволяет считывать и сохранять файлы различных графических форматов. Единственная проблема – это то, что он не очень полезен для попиксельной обработки – например если нужно перевести битмап в ч/б. Под катом – небольшой этюд на эту тему.

Допустим у нас есть два битмапа, один из которых считан из файла, а другой должен содержать ч/б конверсию:

Мы хотим чтобы targetBitmap был как sourceBitmap , только черно-белый. На самом деле, в C# делается это просто:

Это решение понятное и простое, но к сожалению жуть как неэффективное. Чтобы получить более «резвый» код, можно попробовать написать все это дело на С++. Для начала создадим структурку для хранения цветовых значений пикселя

Теперь можно написать функцию которая будет делать пиксель черно-белым:

Теперь собственно пишем саму функцию обхода:

А дальше остается только использовать ее из C#.

Это улучшило быстродействие, но мне захотелось еще большего. Я добавил директиву OpenMP перед циклом по y и получил предсказуемое ускорение в 2 раза. Дальше захотелось поэкспериментировать и попробовать применить еще и SIMD. Для этого я написал вот этот, не очень читабельный, код:

Несмотря на то, что этот код делает 4 операции умножения за раз (инструкция _mm_mul_ps ), все эти конверсии не дали никакого выигрыша по сравнению с обычными операциями – скорее наоборот, алгоритм начал работать медленнее. Вот результаты выполнения функций на картинке 360×480. Использовался 2х-ядерный MacBook с 4Гб RAM, результаты усредненные.

очистить многоуровневую std :: map

Я ожидаю, что myMap.clear () также очистит myInsideMap.
это будет работать, что я ожидал?

Решение

Я ожидаю, что myMap.clear () также очистит myInsideMap. это будет работать, что я ожидал?

Нет. myMap.clear() уничтожит свой собственный копия из myInsideMap , myMap прекратит свое существование, когда constructor() сфера вышла.

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

Другие решения

Цитирую примечание из стандартного раздела 23.2.1, в котором говорится об общих требованиях к контейнерам:

деструктор применяется к каждому элементу a; вся память освобождается.

Я ожидаю, что myMap.clear () тоже очистит myInsideMap

Нету. myMap очищает содержимое только mapMap, который включает в себя объект std :: pair, который, в свою очередь, имеет копию myInsideMap.

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

это очищено правильно ?? рекурсивно?

Да, myMap очищается здесь, но рекурсивное уничтожение происходит следующим образом — деструктор std :: pair вызывается внутренне, для которого уничтожаются ключ и значения. Так как копия myInsideMap была значением в этой парной структуре, этот контент также уничтожается. Таким образом, деструктивная «рекурсия» не затрагивает локальный или фактический myInsideMap в constructor ().

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

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

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