Как записать map в файл c

Обновлено: 07.07.2024

Я хочу записать файл из объекта Map . Вот моя попытка.

Как мне это сделать?

4 ответа

Я знаю, что мы можем загрузить объект из файла .class, и мой вопрос заключается в том, как сделать это наоборот. Я использую Class.forName(classname) , чтобы получить объект класса, и как я могу записать это обратно в файл .class? Класс сериализации не является точкой для этой проблемы, поскольку.

Каков самый быстрый способ записать объект S3 (ключ к которому у меня есть) в файл? Я использую Java.

Вы можете использовать такие инструменты, как Джексон , чтобы записать java карт как json и прочитать их как карту. Как уже упоминали другие, это только один из возможных способов.

Полный рабочий пример чтения/записи

Если файл map.json на вашем classpath содержит

Приведенный выше код изменит его и запишет в файл /path/to/map2.txt , который будет содержать

В java есть концепция сохранения состояния объекта и его последующего извлечения, называемая 'Serialization'.
Для Записи Объекта

Для Чтения Объекта

Я хочу записать объект в файл. Но согласно моему исследованию, я обнаружил, что это невозможно без сериализации объектов. Другой способ-преобразовать объект в массив байтов, а затем записать в файл. Но для этого также требуется сериализация объектов. Есть ли другой способ записать объект в файл.

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

Простой вариант решения этой проблемы-использовать библиотеку Gson:

Похожие вопросы:

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

я хочу записать объект моего класса в файл и использовать его позже . например, я хочу записать t4 в файл: BinaryTree t1 = new BinaryTree( 1 ); BinaryTree t3 = new BinaryTree( 3 ); BinaryTree t5 =.

Я знаю, что мы можем загрузить объект из файла .class, и мой вопрос заключается в том, как сделать это наоборот. Я использую Class.forName(classname) , чтобы получить объект класса, и как я могу.

Каков самый быстрый способ записать объект S3 (ключ к которому у меня есть) в файл? Я использую Java.

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

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

private Map<String, List<DrawPath>> savedPath= new LinkedHashMap<String, List<DrawPath>>(); Я хочу записать этот savedPath в файл, но выбросить IOException: public static.

Как записать данные карты памяти в Lollipop? Я хочу скопировать изображение с карты памяти, но есть проблема с разрешениями, так что помогите мне, как я могу записать данные карты памяти в версии.

Я создаю программу, в которой мне нужно сохранить(записать) объекты в JSON, а затем загрузить(прочитать) эти объекты обратно в программу. Я уже говорил, что GSON-это хороший способ сделать это.

Я реализую алгоритм сжатия Хаффмана. Таблица перекодировки символов у меня хранится в

Мне нужно сохранять таблицу перекодировки вместе с сжатым файлом. Я записываю таблицу в файл следующим образом:


Можно ли так делать? Если нет, то каков правильный варинт.?

_L_>Можно ли так делать? Если нет, то каков правильный варинт.?

Правильный вариант -- не использовать ассоциативное хранилище там где оно не нужно.

Получится даже быстрее, потому что не нужен поиск по сбалансированному бинарному дереву, который в твоем случае требует log2(256) = 8 итераций не самого быстрого цикла,

R>БугагагГ. Долго ржал.

Да, действительно долго. с 2006 года все ещё успокоится не можешь

Здравствуйте, _Lestat_, Вы писали:

.

_L_>Можно ли так делать?

Естественно нет. Попробуй ради интереса проследить зависимость sizeof(Codes) от количества хранимых в Codes елементов.
Hint: каждый узел — динамический объект. Кроме того, std::string также хранит свое содержимое в динамическом буфере.

_L_>Если нет, то каков правильный варинт.?
Для текстового файла можно так:


Для бинарного бедет несколько сложнее — нужно будет вручную организовать звпись строк.

> . подходит только для POD типов.
В теории верно, на практике чревато Ибо на стороне писателя и
читателя может быть разное выравнивание.

Здравствуйте, _Lestat_, Вы писали:

_L_>Можно ли так делать? Если нет, то каков правильный варинт.?

Нет, так делать нельзя. Подобный вариант сохранения подходит только для POD типов.
Елементы std::map хранятся в куче, и не попадут в файл.

Воспользуйся библиотеками сериализации. К примеру Boost.Serialization.

Здравствуйте, _Lestat_, Вы писали:

_L_>Можно ли так делать? Если нет, то каков правильный варинт.?

Так делать нельзя, потому как std::map и std::basic_string не POD типы и работают с динамической памятью. Ты просто сохраняешь состояние объекта, так как он есть в памяти. Объект агрегирует в себя указатели, не факт (вообще это мало вероятно), что эти указатели будут валидны при попытке загрузить этот объект обратно;

Автор(ы): Андрей Мартынов
Дата: 30.11.2003
В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных — метаданных типов.

Тебе необходимо поддержать простую структуру:

"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.

Здравствуйте, _Lestat_, Вы писали:

_L_>Можно ли так делать? Если нет, то каков правильный варинт.?

Вот работающий кусок кода, который может сериализовать твой map в текстовую строку, и десериализовать строку в map.

Здравствуйте, _Lestat_, Вы писали:

_L_>Можно ли так делать?

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

Здравствуйте, sch, Вы писали:

sch>Правильный вариант -- не использовать ассоциативное хранилище там где оно не нужно.

И в самом деле, интересно: по стандарту можно реализовывать std::map<char, X> как X[256]? И, если можно, кто-то так делает?

Я ожидал, что мой вариант неправильный, т.к. map — это динамический класс.

В итоге я сделал просто. Формат файла получился такой: количество_элементов_в_контейнере, char, длина string, сам string, char, длина string, сам string, и т.д.

Спасибо за ответы.

Здравствуйте, _Lestat_, Вы писали:

_L_>В итоге я сделал просто. Формат файла получился такой: количество_элементов_в_контейнере, char, длина string, сам string, char, длина string, сам string, и т.д.

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

siv>читателя может быть разное выравнивание.

.. и разные размеры базовых типов, и разные ENDIAN.

Здравствуйте, _Lestat_, Вы писали:
_L_>Можно ли так делать? Если нет, то каков правильный варинт.?

БугагагГ. Долго ржал.

ИМХО, boost::serialization тебе поможет .

. и ещё раз БуГаГаГГГ.

"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.

Здравствуйте, siv, Вы писали:
siv>В теории верно, на практике чревато Ибо на стороне писателя и
siv>читателя может быть разное выравнивание.

. мне кажется с тех пор как придумади механизм засериализовать всё что угодно в строку и оттуда же это всё десериализовать, бинарное перепехивание POD объектов стало экзотическим извратом!

"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.

Здравствуйте, Roman Odaisky, Вы писали:

RO>И в самом деле, интересно: по стандарту можно реализовывать std::map<char, X> как X[256]? И, если можно, кто-то так делает?

Элемент мапа (value_type) — это pair<const Key, Value>.
Синтезировать его в итераторе (как это делается у vector<bool>) нельзя, т.к. ссылки и указатели на элементы не должны инвалидироваться при разрушении итератора.
Плюс ещё нужно где-то хранить признаки присутствия. То есть,
— pair<bool, storage<value_type>>[256]
— (value_type*)[256]
— storage<value_type>[256] + bool[256]
где storage<T> — выделенная, но не инициализированная память под объект типа T.

Далее встаёт вопрос о sizeof(map<char,Value>) — значит, массив должен быть динамическим.

Ну и самое главное — этот подход годится только для map<char,Value,Pred,Alloc> у которых
— Alloc способен создавать массив, а не только мелкие объекты (узлы дерева)
— Pred — это less<char> либо greater<char>, либо ещё какие-то порядки, для которых известна проекция на числовую ось, т.е. Pred(c1,c2) == Index(c1)<Index(c2)
(для less<char> Index(c) = (unsigned char)c, а для greater — соответственно, (unsigned char)(-c)).

Так что проще не заморачиваться со специализацией, а делать правильный контейнер "по мотивам".

    Ключом может быть все что угодна. От обычной переменной до класса.

map ключ c++

Поэтому можно с легкостью сделать словарь:

Как создать map

Сперва понадобится подключить соответствующую библиотеку:

Чтобы создать map нужно воспользоваться данной конструкцией:

При создании map все его элементы будут иметь значение нуля.

Также имеется возможность добавить значения при инициализации (С++ 11 и выше):

Итераторы для map

Использование итераторов одна из главных тем, если вам понадобится оперировать с этим контейнером. Создание итератора, как обычно происходит так:

  1. Чтобы обратится к ключу нужно сделать так: it->first .
  2. Чтобы обратится к значению ячейки нужно сделать так: it->second .

Нельзя обращением к ключу ( . ->first ) изменять его значение, а вот изменять таким образом значение ячейки ( . ->second ) легко.

Нельзя использовать никакие арифметические операции над итератором:

Все это будет считаться еще одной ошибкой для компилятора.

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

Нельзя делать то же самое используя операцию присваивания ( it += 1 ) или вычитания ( it -= 1 ).

Чтобы не писать циклы для увеличения итератора на большие значения, можно воспользоваться функцией advance() :

Она сдвигает указанный итератор вниз или вверх на указанное количество ячеек. В нашем случае он сначала увеличит на 7, а потом уменьшит на 5, в итоге получится сдвиг на две вверх.

Вывод контейнера

Давайте попробуем вывести все элементы, которые находятся в контейнере.

cout << "Введите количество элементов: " ; int n ; cin >> n ; for ( int i = 0 ; it != mp . end ( ) ; it ++ , i ++ ) < // выводим их cout << i << ") Ключ " << it -> first << ", значение " << it -> second << endl ;

А вот рабочая программа:

Методы map

Ниже мы разберем функции которые можно использовать для работы с map.

Некоторые функции не могут работать с map из-за его специфической архитектуры.

insert

Это функция вставки нового элемента.

Мы можем сделать то же самое вот так:

count

Эта функция больше подходит для multimap, у которого таких значений может быть много.

У этой функции основная цель узнать, есть ли определенный ключ в контейнере.

  • Если он есть, то передать итератор на его местоположение.
  • Если его нет, то передать итератор на конец контейнера.

Например, давайте разберем данный код:

Давайте рассмотрим поподробнее:

erase

Давайте посмотрим как она работает на примере:

map < string , string > :: iterator full_name ; // создали итератор на passport full_name = passport . find ( "andrey" ) ; // находим ячейку

passport в нашем случае хранит имя как ключ, а фамилию как значение.

В итоге мы уменьшим количество наших элементов на один.

Также здесь мы воспользовались функцией size() , которая возвращает количество элементов.

Создаем простую игру

Пользователю понадобится ввести количество домов на улице и указать для каждого дома сколько людей там проживает.

Далее он может модифицировать данные об улице таким образом:

cout << "Введите количество домов на улице: " ; cin >> n ; // считываем количество cout << "Укажите дом и сколько в нем живет людей: " << endl ; // домов cin >> house ; cin >> people ; // считываем введенные значения cout << "Какое количество людей там проживает: " ; cin >> people ;

Теперь давайте подробно разберем, что тут такое:

А вот рабочая программа:

Плюсы и минусы: использования map

  • Ключом может быть любая переменная. Это огромный плюс, например если придется делать словарь.
  • Долгое добавление нового элемента.
  • Долгое обращение к элементу.
  • Долгое удаление нового элемента.
  • Также слишком затратный по памяти
  1. Если вам требуется быстрый отклик программы, то если возможно оперировать вектором либо массивом лучше использовать именно их.
  2. Если же время не стоит на первом месте, то можно им пренебречь и использовать map.

Упражнение

Создайте программу в которой пользователь сможет использовать данные операции:

C++

Программирование и разработка

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

Примером списка пар ключ / значение является следующий список фруктов и общих цветов их спелой кожуры:

Строки слева от списка образуют ключи; те, что справа, формируют значения. Пары ключ / значение не обязательно должны состоять из строки / строки. Это может быть int / string, string / float, int / float и т. Д. В карте C ++ пара ключ / значение является элементом, и такие элементы образуют список структуры данных. Структура данных карты обеспечивает быстрый поиск данных на основе ключей. Ключи уникальны, а структура карты однозначна. Это означает, что значения могут иметь дубликаты, а ключи — нет.

Чтобы использовать библиотеку карт в программе на C ++, программа должна начинаться с чего-то вроде:

Construction/Destruction

Карта — это ассоциативный контейнер, который должен быть построен из класса карты.

map ( initializer_list < value_type > , const Compare & = Compare ( ) , const Allocator & = Allocator ( ) )

Следующий оператор создает карту для приведенного выше списка путем инициализации:

Обратите внимание на разграничение каждой пары.

Следующая конструкция инициализации использует оператор присваивания:

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

Разрушение
Чтобы уничтожить карту, просто отпустите ее из поля зрения.

Сборка и подгонка Pairs

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

Имя ключевого свойства — первое, а имя свойства значения — второе. Следующий код создает пустую карту и вставляет две пары с помощью функции-члена вставки карты.

Отображение (печать) содержимого карты

В следующем коде используется итератор (it), созданный на основе первого элемента карты, для отображения пар ключ / значение на консоли:

=> здесь не имеет значения C ++. Он просто используется для отделения ключа от соответствующего значения на дисплее. Чтобы получить значение свойства указателя (итератора), используйте -> между указателем (итератором) и именем свойства. Итак, -> имеет значение в C ++.

Обратите внимание, что список отображен в порядке возрастания ключей, хотя элементы не были закодированы.

Доступ к парам ключ / значение по-прежнему можно получить, используя схему for-element-in-list. Следующий фрагмент кода иллюстрирует это:

Как раньше. Обратите внимание, что здесь elem — это имя объекта, а не указатель (и не итератор). Таким образом, за ним следует точка, а не ->, чтобы получить доступ к свойству.

Доступ к элементу

Элемент, которого раньше не было на карте, можно включить с помощью его ключа с помощью оператора []. Значение элемента, который уже есть на карте, можно прочитать с помощью оператора [], используя его ключ. Следующая программа иллюстрирует это:

Если карта объявлена ​​постоянной, то значения ключей изменить нельзя. Однако эту функцию-член можно использовать для чтения значений ключей. Следующий код иллюстрирует это:

Емкость

Длину карты можно определить с помощью функции-члена size (), как показано в следующем коде:

Эта функция-член возвращает истину, если карта пуста, и ложь в противном случае. Пример:

Выход 1 для истины. Было бы 0 для false (в противном случае).

Итераторы

Это возвращает двунаправленный итератор, указывающий на первый элемент карты. Значение элемента (пары), на который он указывает, можно изменить. Пример кода:

Значение второй пары ключ / значение было изменено. Обратите внимание на использование итератора end ().

Это возвращает двунаправленный обратный итератор, указывающий на последний элемент карты. Значение элемента, на который он указывает, можно изменить. Следующий код дает тот же результат, что и приведенный выше:

То же значение для второй пары ключ / значение было изменено.

Модификаторы

С картой, поскольку она всегда будет упорядочена (упорядочена) по клавишам, после вставки не имеет значения, на что программист нацелен на вставку: в начале, внутри или в конце карты. По умолчанию результат используется в порядке возрастания по клавишам.

Изменение карты связано с вставкой, размещением, извлечением, стиранием и очисткой. Установка и установка аналогичны, но установка лучше.

Emplace

Эта функция-член вставляет литералы пары ключ / значение, разделенные запятой, без фигурных скобок, как показано в следующем коде:

Функция-член emplace (args) возвращает пару, соответствующую вставленному элементу. Ключ этой возвращаемой пары — итератор, указывающий на вставленный элемент. Значение этой возвращаемой пары — истина (1), если вставка произошла, и ложь (0), если вставка не произошла.

Обратите внимание на способ кодирования возвращаемого типа для emplace (args). Кроме того, возвращаемая пара не использовалась для получения ключа / значения вставленной пары карты в последнем операторе вывода. Здесь есть два типа пар: пара для карты и пара возврата. Они несовместимы. Если ключ уже существует на карте, возвращенный итератор будет указывать на существующий ключ; тогда логическое значение будет ложным.

Inserting

Эта функция-член вставляет литералы пары ключ / значение, разделенные запятой, с фигурными скобками, как показано в следующем коде:

Объяснение аналогично приведенному выше случаю.

Можно вставить целый список. Сразу после прошивки происходит перестановка (по возрастанию). Иллюстрация:

Читайте также: