| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > организация списка на С++ |
| Автор: Artiom 9.3.2005, 22:35 |
| Как лучше организовать список на С++ чтобы было удобно пользоваться, но сделать это вне ООП. Я как не начинаю думать тут же пишу класс, а мне надо без них. |
| Автор: S.A.P. 9.3.2005, 22:52 |
| Artiom а структуры подойдут? |
| Автор: bel_nikita 9.3.2005, 22:53 |
| а через struct пробывал |
| Автор: Fixin 9.3.2005, 23:01 |
| Какой именно список? |
| Автор: Дрон 9.3.2005, 23:22 |
| Так ведь методы класса отличаются от обычных функций только наличием скрытого параметра this. Что тебе мешает сделать структуру и набор функций, аналогичных тем, которые могли бы быть в классе, и передавать этим функциям указатель (или ссылку) на структуру |
| Автор: Artiom 9.3.2005, 23:45 | ||||
Двунаправленный.
Не знаю. Наверное какой-то внутренний барьер мешал Просто всё это кажется жутко неудобным, а то что приходится переделывать программу с целью сделать её более примитивной просто бесит. |
| Автор: Nastya 10.3.2005, 09:14 |
| А если не секрет, зачем, не ужели задача НАСТОЛЬКО требовательна к ресурсам? |
| Автор: pablo 10.3.2005, 10:55 |
| А не проще просто сделать структуру ввиде данных, и указателей на начало и конец списка. Ну а потом снабдить его методами обработки данных: вставки, удаления, и т.п. ? |
| Автор: Artiom 10.3.2005, 16:19 | ||
Задача - реализация различных численных методов с участием разреженных матриц очень больших размеров. Чтобы не хранить нулевые элементы использую список. Возможно отказ от классов и даст какой-то выигрыш в скорости.... По крайней мере такова задумка моего научного руководителя. |
| Автор: redrick 10.3.2005, 17:17 |
| но все же руками будешь писать... неужели stl, boost никак не впихнуть - всеж уже написано за нас... а то есть ведь и асм =)) |
| Автор: Artiom 10.3.2005, 18:09 |
| redrick A что такое STL как не классы? |
| Автор: Fixin 10.3.2005, 18:13 |
| Нужен связный двунаправленный список? |
| Автор: redrick 10.3.2005, 18:18 | ||
не спорю - просто лишний раз посомневался стоит ли оно того... почему тогда именно С++ ? |
| Автор: maxim1000 10.3.2005, 18:21 | ||||
если не использовать виртуальных функций, то код
тупо заменяется на
при компиляции (вообще-то эти слова не помешало бы проверить дизассемблером, но вроде бы так) так что никакого выигрыша от отказа от классов нету (я не имею в виду, что он маленький, я имею в виду, что его нету совсем) ма-а-а-аленький выигрыш может получиться, если функция была виртуальная, тогда он еще полезет в таблицу за ее адресом, но если функция - не простое присваивание значения одной переменной, то выигрыш будет мизерным... попробуй показать дизассемблированные коды вызова методов в разных ситуациях своему научному руководителю, возможно, это несколько прояснит ситуацию и позволит более точно оченить выигрыш от отказа от использования классов... |
| Автор: Artiom 10.3.2005, 19:10 | ||
Именно! maxim1000 Спасибо, учту |
| Автор: Artiom 10.3.2005, 23:06 |
| Написал. Нифига быстрее не стало. |
| Автор: Chaos A.D. 10.3.2005, 23:46 | ||||||
Вот, держи. Это должно помочь тебе. Почти полноценный класс. Единственное отличие от класса - функция at - что-то вроде operator[], только в глобальной области действия.
Наверное в коде полно ошибок - я торопился, и не тестировал почти. Разве что вот такой пример скомпилил :
Надеюсь, тебе это подойдет для твоих целей. Можешь еще добавить всяких ф-кций для
|
| Автор: bel_nikita 10.3.2005, 23:59 | ||
А может не стоит мучаться, а использовать std::list |
| Автор: Chaos A.D. 11.3.2005, 00:03 | ||
Дык ему же вроде без классов (: Если препод ламер (частенько такие встречаются) - можешь приколоться - сделать #define struct class, где-нибудь в дебрях кода. |
| Автор: Artiom 11.3.2005, 00:36 | ||||
Chaos A.D. спасибо за код, но я уже
Но в любом случае пригодится.
Ну это уж слишлом |
| Автор: chipset 11.3.2005, 01:38 |
| Ну если struct можно было использовать, то это вообще окей... Правда, в C++ они НИЧЕМ не отличаются от классов. |
| Автор: Fantasist 11.3.2005, 03:34 | ||||||||
Совершенно верно. Классы в С++ проектировались так, чтобы не нести никаких накладных расходов. Так что в данном случае отказ от классов есть принесет только потерю структурированности и читабильности кода (не обязательно, но очень вероятно).
Такие функции обычно делаются inline и опять не будет никаких потерь. Добавлено @ 03:37
Ага и что это даст? Ведь
за исключением того, что в структуре все поля по умолчанию public тогда как в классах private. |
| Автор: maxim1000 11.3.2005, 10:36 | ||||
ну насчет ламерства препода я бы не был так уверен как я уже говорил, отказ от классов на уровне языка практически ничего не дает НО можно отказаться от классов на более высоком уровне ООП имеет, по сути, один эффект: позволяет не думать обо всем сразу например, реализовал вектор и забыл - просто пользуешься этот подход позволяет решать задачи значительно большей сложности, чем без его использования однако, представим себе, что нам надо заполнить вектор нулями как можно быстрее какой самый быстрый способ? memset, если я не ошибаюсь но в случае класса не пойдет: мы же не знаем как он там реализован, вдруг он в виде списка? поэтому если уж отказываться от классов, то стоит подумать не о том, как хранить элемент матрицы, а о том, как хранить матрицу... например, один из возможных способов хранения: матрица - массив строк (просто указателей) строка - массив элементов типа (i,ai) - пара из индекса элемента и его значения в конце строки какой-нибудь условный признак, типа i=-1 (заметим, что уже после этого ничего не мешает нам представить строку в виде класса) достоинства такого метода: 1. память - используется большая экономия памяти: если у нас всего n элементов в строке, понадобится 10*n=8*n+2*n (это если sizeof(double)=8, а ширина матрицы до 65536), в случае списка нужно хранить: элемент, его координаты, указатель на следующий - значительно больше 2. скорость действия на вектор: просто идем по строке и делаем простую операцию y+=ai*x[i] недостатки: далеко не все операции удобно выполнять в таком виде (все то же транспонирование, например) однако для итеративных методов обращения матрицы, насколько я припоминаю, основной операцией является как раз действие на элемент... Добавлено @ 10:38
здесь я говорил о вирутальных функциях честно говоря, сомневаюсь, чтобы они делались inline (ведь адрес функции будет известен только во время исполнения)... |
| Автор: Fantasist 11.3.2005, 23:12 | ||||
Обычно, функции которые только изменяют значение одной переменной невиртуальные. Виртуальными делают те, которые несут какую-то логику, чаще всего в них выполняются более развернутые операции.
Это если используешь указатели на класс. Никто не мешает тебе создать переменную этого класса, тогда и виртуальные функции будут вызываться статически и могут быть встроенны. |
| Автор: Fixin 11.3.2005, 23:29 |
| А может динамическим массивом заменить? Из структур, например. И еще, он еще нужен? |
| Автор: Artiom 12.3.2005, 00:35 |
| Я уже решил, что буду кроме списка реализовывать метод на основе бинарного дерева. Кроме того можно применять хеширование, но оно применяется при высокой степени заполнения матрицы. А со списком я уже разобрался и всё написал. |
| Автор: bel_nikita 12.3.2005, 03:21 | ||||
maxim1000
Вектор - это вектор, а список - это список. Не надо смешивать до кучи В std::vector заведомо истино условие: &v[i] == &v[0] + i А это говорит, что std::vector может быть задействован во всех случаях, когда используется динамический массив. Например, вполне допустимо:
|
| Автор: Да гость я... 12.3.2005, 09:57 | ||
Скажите Artiom, 1) Сосредотачиваются ли ненулевые элементы матрицы у главной дипгонали? 2) Симметрична ли матрица? 3) Что за численные методы вы используете, не МКЭ ли случаем? |
| Автор: Artiom 12.3.2005, 18:42 | ||
1) Матрица произвольна. 2) Нет 3)Решение сис-м линейных уравнений - прямые методы. |