![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
formut |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 10.8.2014 Репутация: нет Всего: нет |
Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор. Редактирование, на первый взгляд, тривиальное и реализуется тремя методами класса:
Представим, есть объект класса с переданным ему для редактирования блоком данных. Допустим, у нас произошел последовательный вызов таких методов:
Ах, да! Чуть не забыл главное условие: никаких стандартных и, уж тем более, сторонних библиотек. Только "чистый" C++ и WinAPI. |
||||||||
|
|||||||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
что подрузамевает delete? удаление байт со смещением, и уменьшение размеров исходных данных? как vector.remove или как его там? или просто затирание 0ми?
Если второе, то изменение ланных на лету - оптимально Это я к тому что если передается указатель на данные, то не вы же контролируете их размер Правда как тогда будет insert работать - ума не приложу Это сообщение отредактировал(а) sQu1rr - 15.9.2014, 22:23 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Чтобы много не выдумывать, Вам следует применить базу данных, умеющую работать в памяти, например sqlite. Перед началом измененией начинаете тразакцию transaction(), в конце делаете commit() или rollback() чтобы отказаться от изменений. Или реализуйте механизм транзакций самостоятельно.
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Вычисление того, что в результате нужно будет сделать над исходными данными при применении к ним последовательности операций тоже требует времени и ресурсов, причем скорее всего больше, чем само копирование данных. Так что 'удалять промежуточные шаги' имеет смысл только в том случае, если у вас очень большие массивы данных либо вы планируете применять одни и те же модификации многократно. Для этого можно покрыть ваш массив данных набором интервалов. Изначально есть 1 интервал, покрывающий весь массив и содержащий данные массива. Далее каждое действие выполняется над текущим набором интервалов, в результате получается новый набор. Ну и в конце по результирующему набору строится выходной массив. Для вашего примера (положим начальный массив был 20 байтов):
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Только учтите, если будете действовать как советует xvr, промежуточные данные (MyData) должны сохраняться до получения результата.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |