![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
RedDigger |
|
||||||||||||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Программа номер раз
вывод -
программа номер два..
вывод -
|
||||||||||||
|
|||||||||||||
Master01 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 22.8.2007 Репутация: 2 Всего: 2 |
Вы не совсем правильно понимаете эти результаты. Контейнер будет занимать всегда на N байт больше и это не зависит от количества элементов. Например, если память мне не изменяет, std::vector даже пустой (не содержащий полезных данных) занимает где-то 20 байт. т.о. если говорить, к примеру, о массиве int из 1024 элементов, требующих для хранения (предполагаем что int = 4 байта) 4 Кб, то эти 20 байт уже не кажутся таким кащунственным разбазареванием ресурсов. А лепить что-то своё, ради выйгрыша в 20 байт весьма сомнительно ... а вот политика выделения памяти, которой следует тот или иной контейнер - это действительно то, на что слежует обратить внимание, если нужно что-то оптимизировать. |
|||
|
||||
RedDigger |
|
|||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Не учел... Спасибо за разъеснение.
|
|||
|
||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Тут вроде-бы в помощь shared_ptr, но для того что-бы достучаться до элемента, придётся делать как-то так:
Лично мне такой вариант не очень... Это сообщение отредактировал(а) Леопольд - 30.9.2010, 16:43 -------------------- вопросов больше чем ответов |
||||
|
|||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Что-то я не понял, почему трижды. При глубоком копировании вектора векторов векторов векторов ... любой степени вложенности всё копируется единожды. По крайней мере, если вектор == std::vector. Но так должно быть и у любого другого вменяемого вектора. |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Я говорил про swap, который повсеместно используется в STL. Он создаёт временную копию.
Это сообщение отредактировал(а) Леопольд - 2.10.2010, 10:13 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
ElKa |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
RedDigger,
а как передавать такие массивы объектам других классов? мне нужно создавать объекты, которые содержат по два трехмерных массива в общем конструктор должен быть такой
и операторы наверное же тоже нужны myarray.h
myarray.cxx
Это сообщение отредактировал(а) ElKa - 2.10.2010, 17:58 |
||||||
|
|||||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
RedDigger |
|
||||||||
![]() Программист Профиль Группа: Участник Сообщений: 26 Регистрация: 24.9.2010 Где: Москва Репутация: 1 Всего: 1 |
Лучше всего передовать их по ссылке. В данном случае стек вызовов не переполняется лишними объектами. А внутри класса куда тебе надо завести данные создаешь член класса типа MyArray * (допустим)_b. Но с операторами ты немного намудрила. впринципе могу помочь.. Мои координаты - Skype: sl.spell Mail: pn.spell{at}gmail.com |
||||||||
|
|||||||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это сообщение отредактировал(а) Леопольд - 3.10.2010, 17:01 -------------------- вопросов больше чем ответов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]()
Это сообщение отредактировал(а) mes - 3.10.2010, 17:34 |
|||
|
||||
ElKa |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: нет Всего: 4 |
посмотрите пожалуйста код
почему то не те элементы вызываются и зависает ехе массивы 3мерные и что-то я с этими указателями запуталась и еще меня смущает operator [](int i), я его оставила таким же как для одномерных массивов, это правильно? array.h
array.cxx
|
||||
|
|||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
ElKa, c двумерными массивами код уже сложно читать, а с тремя измерениями становится совсем тяжко, что чревато багами.
Индексы лучше переименовать в column, row, dept (или x, y ,z) во всём коде. Если производительность не критична, то можно попробовать уйти от трехмерных массивов. Например, использовать что-то типа std::map<Point3d, float>. IMHO логика в Array::setValue извращённая, если выход за границы, возвращает true, если всё ОК, возвращает false. Макроса assert в релизе обычно нет (#define NDEBUG). Проверять им что недостаточно памяти не стоит. Использовать malloc a потом delete[], это, по моему уже UB(undefined behaviour). Вместо malloc надо использовать new[]; Вызывает подозрение что на три выделения памяти делается два delete (а не три). Если есть возможность то лучше использовать исключения (или assert, если позволяет специфика приложения) в Array::getValue и Array::setValue. Исключения более универсальны, assert не обработаешь, но зато нет накладных расходов. В Array::operator= утечка памяти. Вместо трёх delete, всего один. И вообще, возникает ощущение что код писали как в мульте "Простоквашино" писали письмо. Строчку ты, строчку твой кот, а всё остальное Шарик... ![]()
Возникает ощущение что ты сама его не смотрела. Видимо практикуешь "слепой" десятипальцевый набор с завязанными глазами.. ![]() P.S. А может это просто стёб? Бывает и такое. Весьма похоже, надо сказать. Это сообщение отредактировал(а) Леопольд - 6.10.2010, 10:25 -------------------- вопросов больше чем ответов |
||||
|
|||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Если оно надо, то можно допилить.
LWS Это сообщение отредактировал(а) Леопольд - 31.10.2010, 13:30 -------------------- вопросов больше чем ответов |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |