Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(bsa @  4.12.2007,  15:31 Найти цитируемый пост)
#include <vector>
std::vector
#include <map>
std::map
#include <list>
std::list
#include <set>
std::set


в Си  smile ?

Автор: Lazin 4.12.2007, 15:49
в си есть realloc и указатели))

Автор: Anton Vatchenko 4.12.2007, 15:55
Нет, а по принципу vector и прочие?

Автор: Fazil6 4.12.2007, 15:56
Цитата(Anton Vatchenko @  4.12.2007,  15:55 Найти цитируемый пост)
Нет, а по принципу vector и прочие?

нету

Автор: zkv 4.12.2007, 15:59
Цитата(Anton Vatchenko @  4.12.2007,  15:55 Найти цитируемый пост)
Нет, а по принципу vector и прочие? 

дык определись, с или с++?
Просто в с по определению не может быть контейнеров типа 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 в секунду) это самое количество элементов меняется...

Автор: zkv 4.12.2007, 16:28
Цитата(Anton Vatchenko @  4.12.2007,  16:23 Найти цитируемый пост)
Маллок умеет динамические массивы делать (то есть, где все время меняется количество элементов)? Это что-то новое... То есть он сможет мне помочь работать с массивами то из 10, то из 1000 элементов, где на каждом шаге (раз 20 в секунду) это самое количество элементов меняется...

перечислили доступный инструментарий уже:
Цитата(bsa @  4.12.2007,  15:31 Найти цитируемый пост)
malloc/calloc/realloc/free

Автор: 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
Цитата(Anton Vatchenko @  4.12.2007,  16:04 Найти цитируемый пост)
Мне нужны динамические массивы

так используй realloc 

Код

//создаем динамический:-) массив
char* arr = (char*)realloc(NULL, 128);
//изменяем размер
arr = (char*)realloc(arr, 1024);


Добавлено через 5 минут и 11 секунд
когда realloc делаешь содержимое массива сохраняется, да-же если указатель изменился...

Автор: bsa 4.12.2007, 16:44
Anton Vatchenko, извиняй. На C++ уже сделали оптимизацию, а на Си, возможно, нет. Хотя, может быть, что те же malloc и realloc немного оптимизированы. Но не так, как vector.
С другой стороны, если тебе нужно часто менять количество элементов, но случайный доступ к ним не нужен, то имеет смысл использовать дву/односвязные списки - там не придется каждый раз выделять кучу памяти под все объекты.

Автор: zkv 4.12.2007, 16:53
Цитата(Anton Vatchenko @  4.12.2007,  16:33 Найти цитируемый пост)
Ведь не зря в С++ есть вектора, хэшмапы и прочее... Вот я хотел бы и тут найти... 

два разных языка программирования - с и с++, почему если есть в с++, то должно быть в с? 
нету ничего и не может быть, так как нет средств в с для создания таких вещей как 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
Цитата(Anton Vatchenko @ 4.12.2007,  16:58)
Мне нужен принцип быстрой работы как в Векторе - я добавляю один элемент, но в памяти добавляется небольшой кусок, и связывается по ссылкам с соседними, а не копируется тупо весь массив...

Ты видимо даже не знаешь, как работает 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
Цитата(Anton Vatchenko @ 4.12.2007,  17:06)
В Си никто не смог сделать компонент типа Вектор? Я на си писал такое, но хотел бы получить не корявый вариант... То есть функции типа:

listAdd(List *list, void *data);
listRemove(List *list, int position);
listInsert(List *list, void *data, int position);

И пусть меня никто не смешит, что это невозможно сделать, так как мы это делали еще в школе на информатике. Делали односторонние, двухсторонние списки, очереди, стеки, и т. д.

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
Цитата(Anton Vatchenko @  4.12.2007,  18:14 Найти цитируемый пост)
glib очень массивная библиотека... 

это не аргумент от неё отказываться. а ядро вообще весит до фига... давайте без него, да? smile

Автор: Random13 4.12.2007, 23:35
На С++ есть тэмплейтовские вектора и т.д. на С нужно писать все самому, думаю на С++ они так и имплементированы посредством маллока и реаллока.
А что за потребность писать на С, а не на С++ - работаешь с проектом уже написанный на С ?

Автор: onsql 4.12.2007, 23:38
Цитата(Anton Vatchenko @ 4.12.2007,  18:14)
glib очень массивная библиотека...

А вот такое подойдёт- http://sglib.sourceforge.net/ ?
Прямо почти что темплейты на си  smile 

Автор: 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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)