| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Какие есть динамические массивы в Си? |
| Автор: Anton Vatchenko 4.12.2007, 15:27 |
| Привык писать на С++ под винду, а тут не знаю как... |
| Автор: bsa 4.12.2007, 15:31 |
| Anton Vatchenko, точно также: #include <vector> std::vector #include <map> std::map #include <list> std::list #include <set> std::set да и malloc/calloc/realloc/free тоже имеются |
| Автор: Fazil6 4.12.2007, 15:38 | ||
в Си |
| Автор: Lazin 4.12.2007, 15:49 |
| в си есть realloc и указатели)) |
| Автор: Anton Vatchenko 4.12.2007, 15:55 |
| Нет, а по принципу vector и прочие? |
| Автор: Fazil6 4.12.2007, 15:56 |
нету |
| Автор: zkv 4.12.2007, 15:59 |
дык определись, с или с++? Просто в с по определению не может быть контейнеров типа vector |
| Автор: Anton Vatchenko 4.12.2007, 16:04 |
| Так вот поэтому я и спрашиваю про Си, но работал с vector, а 90% ответов тут дали люди невнимательные... Мне нужны динамические массивы, посему маллок не подойдет, вектор - в с++. |
| Автор: bsa 4.12.2007, 16:19 |
| Anton Vatchenko, malloc - это выделение памяти. именно он тебе и нужен (ну может с calloc проще будет, хотя это по сути одно и тоже). я только вот не понял, а причем тут Unix? |
| Автор: Anton Vatchenko 4.12.2007, 16:23 |
| Маллок умеет динамические массивы делать (то есть, где все время меняется количество элементов)? Это что-то новое... То есть он сможет мне помочь работать с массивами то из 10, то из 1000 элементов, где на каждом шаге (раз 20 в секунду) это самое количество элементов меняется... |
| Автор: bsa 4.12.2007, 16:31 |
| Anton Vatchenko, ты вообще знаешь, как vector работает? Когда делаешь resize(10): Если capacity()>=10, то память не выделяется, в противном случае выделяется с помощью realloc 2*max(capacity(), 10) * sizeof(value_type), capacity принимает значение количества выделенных элементов. Но пользователю предоставляется только new_size... |
| Автор: Anton Vatchenko 4.12.2007, 16:33 |
| Но это достаточно страшный метод, который я никогда не использую... Ведь не зря в С++ есть вектора, хэшмапы и прочее... Вот я хотел бы и тут найти... |
| Автор: Lazin 4.12.2007, 16:37 | ||
так используй realloc
Добавлено через 5 минут и 11 секунд когда realloc делаешь содержимое массива сохраняется, да-же если указатель изменился... |
| Автор: bsa 4.12.2007, 16:44 |
| Anton Vatchenko, извиняй. На C++ уже сделали оптимизацию, а на Си, возможно, нет. Хотя, может быть, что те же malloc и realloc немного оптимизированы. Но не так, как vector. С другой стороны, если тебе нужно часто менять количество элементов, но случайный доступ к ним не нужен, то имеет смысл использовать дву/односвязные списки - там не придется каждый раз выделять кучу памяти под все объекты. |
| Автор: zkv 4.12.2007, 16:53 | ||
два разных языка программирования - с и с++, почему если есть в с++, то должно быть в с? нету ничего и не может быть, так как нет средств в с для создания таких вещей как vector. |
| Автор: Anton Vatchenko 4.12.2007, 16:58 |
| Насколько я понимаю, реаллок заново выделяет память и переносит старые данные на новое место. Мне нужен принцип быстрой работы как в Векторе - я добавляю один элемент, но в памяти добавляется небольшой кусок, и связывается по ссылкам с соседними, а не копируется тупо весь массив... То есть цикл: Array array; int i; for(i = 0; i < 1000; i++) { if(needInsert(i)) arrayAdd(&array, i); } работал быстро... |
| Автор: bsa 4.12.2007, 17:01 | ||
Ты видимо даже не знаешь, как работает vector и чем он отличается от list. Так вот, вектор в простейшем случае работает, как realloc (а точнее, так, как я описал на той странице), а вот list (двусвязный список) работает так, как ты написал. Кстати, к элементам list ты не можешь обращаться по индексу. Только через "итераторы" (указатели). |
| Автор: Anton Vatchenko 4.12.2007, 17:06 |
| >> нету ничего и не может быть, так как нет средств в с для создания таких вещей как vector Что значит не может быть? В Си никто не смог сделать компонент типа Вектор? Я на си писал такое, но хотел бы получить не корявый вариант... То есть функции типа: listAdd(List *list, void *data); listRemove(List *list, int position); listInsert(List *list, void *data, int position); И пусть меня никто не смешит, что это невозможно сделать, так как мы это делали еще в школе на информатике. Делали односторонние, двухсторонние списки, очереди, стеки, и т. д. |
| Автор: bsa 4.12.2007, 17:28 | ||
vector != list Нельзя на Си сделать такой компонент. Просто потому, что в Си нет шаблонов! А для каждого из стандартных типов будет недостаточно. |
| Автор: Anton Vatchenko 4.12.2007, 17:32 |
| Да я ж не про шаблоны спрашивал, а про обычные динамические массивы, списки... |
| Автор: bsa 4.12.2007, 17:39 |
| Anton Vatchenko, хорошо. тогда скажи, как ты представляешь стандарный список, который будет работать со struct mystruct? |
| Автор: Anton Vatchenko 4.12.2007, 17:54 |
| Этот список должен работать с ней, как с void*, как это часто и делается, если нет шаблонов... |
| Автор: orthrus 4.12.2007, 18:07 |
| Может быть тебе подойдет функционал библиотеки glib? Списки, очереди, динамическии массивы (garray что то вроде вектора) и еще куча всякой всячины там есть. |
| Автор: Anton Vatchenko 4.12.2007, 18:14 |
| glib очень массивная библиотека... |
| Автор: JackYF 4.12.2007, 20:21 |
это не аргумент от неё отказываться. а ядро вообще весит до фига... давайте без него, да? |
| Автор: Random13 4.12.2007, 23:35 |
| На С++ есть тэмплейтовские вектора и т.д. на С нужно писать все самому, думаю на С++ они так и имплементированы посредством маллока и реаллока. А что за потребность писать на С, а не на С++ - работаешь с проектом уже написанный на С ? |
| Автор: onsql 4.12.2007, 23:38 | ||
А вот такое подойдёт- http://sglib.sourceforge.net/ ? Прямо почти что темплейты на си |
| Автор: Anton Vatchenko 5.12.2007, 12:05 |
| Отвечу на все вопросы... Работаю на Си, потому как на линуксе на слабом компьютере, люблю Си больше С++... И поэтому подключение любых дополнительных библиотек приведет к "ужасным" последствиям.. Я думал, что есть функции типа printf и прочих, которые уже содержатся в ядре, если не ошибаюсь... Может тогда кто-то подскажет где найти один си-файл, чтобы подключить к своему проекту, где хорошо реализован динамический массив... Достаточны функции типа add, remove, insert, next, prev, first... |
| Автор: bsa 5.12.2007, 16:13 |
| http://forum.vingrad.ru/forum/topic-184746.html |