Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Realloc в С++, чем плохо  
V
    Опции темы
sergioK1
Дата 12.3.2012, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(xvr @ 12.3.2012,  07:48)

Цитата(sergioK1 @  12.3.2012,  00:01 Найти цитируемый пост)
 мне надо 100 прибавлять,

Управляйте размером и резервацией в векторе явно (resize() и reserve())

как это будет на С++ не словах, smile  ,   

mess , как ?, внутри вектора есть обьест, который при добавке умножает память на 2,  как мне этот обьект получить ?
пример если не трудно положите 




Это сообщение отредактировал(а) sergioK1 - 12.3.2012, 09:32
PM MAIL   Вверх
mes
Дата 12.3.2012, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(sergioK1 @  12.3.2012,  08:26 Найти цитируемый пост)
mess , как ?

mes smile

Цитата(sergioK1 @  12.3.2012,  08:26 Найти цитируемый пост)
внутри вектора есть обьест, который при добавке умножает память на 2,  как мне этот обьект получить ?

самого вектора достаточно..

Цитата(sergioK1 @  12.3.2012,  08:26 Найти цитируемый пост)
пример если не трудно положите 

http://liveworkspace.org/code/ba491fe1c0f7...622e759b9282854


--------------------
PM MAIL WWW   Вверх
xvr
Дата 12.3.2012, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(sergioK1 @  12.3.2012,  09:26 Найти цитируемый пост)
как это будет на С++ не словах,

Код

void my_push_back(vector<int>& dst, int value)
{
 if (dst.size()+1>=dst.capacity()) dst.reserve(dst.capacity()+100);
 dst.push_back(value);
}


PM MAIL   Вверх
volatile
Дата 13.3.2012, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



В векторе же не только пуш-бек, добавлять может
там еще придется "костылировать"... smile

Добавлено через 3 минуты и 54 секунды
sergioK1, вам имхо нужен не вектор.
рассмотрите возможность использования deque.
PM MAIL   Вверх
sergioK1
Дата 13.3.2012, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 13.3.2012,  01:09)
В векторе же не только пуш-бек, добавлять может
там еще придется "костылировать"... smile

Добавлено @ 02:13
sergioK1, вам имхо нужен не вектор.
рассмотрите возможность использования deque.

там еще придется "костылировать" 
А это на каком языке  ?  smile 

Alocator для чего? только не говорите что мне он не нужен (так многие говорят, и пугают им как бабой ягой  smile  ) 
как с ним работать? , примерчик если не сложно





PM MAIL   Вверх
xvr
Дата 13.3.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(sergioK1 @  13.3.2012,  12:18 Найти цитируемый пост)
Alocator для чего?

Для выделения/удаления памяти и инициализации объектов на ней. Стандартный Allocator аналогичен связке из new/delete и конструктора и деструктора для произвольного класса (для этого там используются шаблонные функции).
Свой Allocator нужен если вы хотите изменить стандартный менеджер памяти для конкретных экземпляров контейнера (например сделать память на пуле, а не в куче)
На внутреннее функционирование контейнеров Allocator не влияет

Добавлено через 43 секунды
Цитата(sergioK1 @  13.3.2012,  12:18 Найти цитируемый пост)
А это на каком языке  ?  smile 

На С++ - std::deque<> - стандартный контейнер

PM MAIL   Вверх
sergioK1
Дата 13.3.2012, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



1) Что значит фраза из предыдушего поста , "там придеться костылить"

2) разницу между деком и вектором не понимаю  , дока пишеть что more efficient , 
   видимо  доступ вместо O(n)   O(log2) или  O(1) ,  ну и инсерт хуже соответсвенно ,  методы у обоих класов одинаковые, 
 а  что там мор когда и  на сколько?,
PM MAIL   Вверх
bsa
Дата 13.3.2012, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



sergioK1, 
Цитата
Double-ended queues (or deques) are similar to vectors, except that they allow fast insertions and deletions at both the beginning and the end of the container and that they are not required to be contiguous.
Deques are commonly implemented as lists of individual dynamically allocated arrays of some convenient size, e.g. memory page size. This guarantees constant time access, amortized constant time insertion and deletion at either end of the deque (a new array may have to be allocated), and linear time insertion and deletion from the middle of the deque.
Если не понятно: deque гарантирует аммортизированное константное время вставки в начало и конец контейнера. У вектора переаллокация вызывает полное копирование всего массива. У deque копирования не будет, а просто довыделится память под следующие несколько элементов...
PM   Вверх
volatile
Дата 14.3.2012, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(sergioK1 @  13.3.2012,  14:02 Найти цитируемый пост)
Что значит фраза из предыдушего поста , "там придеться костылить"

то что, в вектор добавлять придется не стандартной процедурой:
vector.push_back (element); а костылем: 
my_push_back (vector, element);
Кроме-то в вектор могут добавлять и другие методы. Их тоже нужно переписывать.
Извиняюсь за придуманное слово "костылировать"  smile мне показалось, что оно хорошо отражает суть дела.

Насчет дека, добалю к тому что сказал bsa, у него есть один недостаток, по сравнению с вектором: Данные расположены не непрерывно. Второй недостаток это несколько медленное время доступа к центральным элементам. (По опыту скажу, не на много медленее, по крайней мере в студии)
Преимущества: Выделят блоки примерно так как вы хотите, порциями. Все прежде выделенные блоки остаются на своих местах, никаких гигантских перераспределений памяти (как в векторе) не бывает. Вообще ведет себя довольно ровно, в отличии от вектора. Последний,  при достаточном размере, может в буквальном смысле подвесить программу на n-ое кол-во секунд, с требованиями трехкратного запаса памяти. Как это происходит: Допустим вектор имеет размер 1000, постпупил еще 1 элемент, в этот момент он затребует 2000 памяти, (1000+2000=3000), потом откопирует, и только потом освободит 1000. То есть, есть момент когда нужен 3-кратный запас по памяти. Кстати, в вашем случае с my_push_back(), нужен будет 2 кратный+100 запас (1000+1100=2100), но и перераспределения будут происходить чаще.
PM MAIL   Вверх
sergioK1
Дата 14.3.2012, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(volatile @ 14.3.2012,  02:13)
То есть, есть момент когда нужен 3-кратный запас по памяти. Кстати, в вашем случае с my_push_back(), нужен будет 2 кратный+100 запас (1000+1100=2100), но и перераспределения будут происходить чаще.

Так Deck  - это получаеться линк лист где вместо нода массив каждый раз разного размера  где последний елемент , 
 указывает на первый в следующем ,  т,е в сранение с просто линк листом , доступ к елеметам  внутри блока будет О(1)(по индексу), 
 т,е у линк листа   это всегдаO(n)  а в деке  как , зная размер каждого блока , сразу будет искать в нужном , ?
 т,е O(average(blockSize) , т,е, при вызове скажем D[5296]  он знает что надо пойти в 38 блок ,  а там все 150 элеметов,
 но это если данные порциями приходят,  скажем по 50 элеметов в среднем , но если придут по 5 то это мало что даст, 
  
 т,е, в плане выделения памяти он ведет себя как линк лист 
 в плане доступа как обычный   массив, 

 т,е применять его можно когда четко знаешь что у тебя за данные ,

Кажеться сам себе ответил  smile 

да еще 
Так тут не один способ релизаций может быть , у каждого поставщика компайлера свой, 

 а вектор (если нельзя изменить *2 ) это зло smile  , не верю что уважающий себя сервер его пользует , 
 наверняка есть либы где , push back и resize виртуальные , или Я чего пропустил ,

   





PM MAIL   Вверх
mes
Дата 14.3.2012, 21:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(sergioK1 @  14.3.2012,  11:39 Найти цитируемый пост)
 а вектор (если нельзя изменить *2 ) это зло

это используется для неизвестного кол-ва данных.. Если есть предположения о кол-ве входящих данных, то нужна своя стратегия увелечения данных.. Более того бывают случаи, когда удобно пользоваться не одним типом контейнера, а смешанным в зависимости от подзадачи..  Например считать данные в деку, чтоб избежать лишнего копирования при перераспределении, а после поместить все в вектор уже нужного размера,   чтоб иметь возможность прямого доступа..



--------------------
PM MAIL WWW   Вверх
sergioK1
Дата 14.3.2012, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет





Все ясно всем спасибо, 
выяснил даже больше чем хотел, 
закрываем лавочку  smile 


Это сообщение отредактировал(а) sergioK1 - 14.3.2012, 22:46
PM MAIL   Вверх
bsa
Дата 19.3.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(sergioK1 @  14.3.2012,  13:39 Найти цитируемый пост)
Так Deck  - это получаеться линк лист где вместо нода массив каждый раз разного размера  где последний елемент , 
 указывает на первый в следующем ,  т,е в сранение с просто линк листом , доступ к елеметам  внутри блока будет О(1)(по индексу), 
 т,е у линк листа   это всегдаO(n)  а в деке  как , зная размер каждого блока , сразу будет искать в нужном , ?

deque (от double ended queue - двусторонняя очередь) это примерно вектор указателей на фиксированные вектора. Т.е. когда ты добавляешь в дек данные, а у него нет под них места, то выделяется блок данных фиксированного размера, и в него уже добавляются данные. Указатель на свежевыделенный блок попадает в вектор указателей. Для вычисления элемента по индексу достаточно ему выполнить: ptr_vector[idx / blk_data_size][idx % blk_data_size];
Как ты понимаешь, время константно.

Это сообщение отредактировал(а) bsa - 19.3.2012, 13:27
PM   Вверх
sergioK1
Дата 19.3.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 19.3.2012,  12:27)
Цитата(sergioK1 @  14.3.2012,  13:39 Найти цитируемый пост)
Так Deck  - это получаеться линк лист где вместо нода массив каждый раз разного размера  где последний елемент , 
 указывает на первый в следующем ,  т,е в сранение с просто линк листом , доступ к елеметам  внутри блока будет О(1)(по индексу), 
 т,е у линк листа   это всегдаO(n)  а в деке  как , зная размер каждого блока , сразу будет искать в нужном , ?

deque (от double ended queue - двусторонняя очередь) это примерно вектор указателей на фиксированные вектора. Т.е. когда ты добавляешь в дек данные, а у него нет под них места, то выделяется блок данных фиксированного размера, и в него уже добавляются данные. Указатель на свежевыделенный блок попадает в вектор указателей. Для вычисления элемента по индексу достаточно ему выполнить: ptr_vector[idx / blk_data_size][idx % blk_data_size];
Как ты понимаешь, время константно.


Понимаю , сам такое когда-то изобретал на С , 
Реализацию где посмотреть ? от поставщика , 

Это сообщение отредактировал(а) sergioK1 - 19.3.2012, 16:11
PM MAIL   Вверх
bsa
Дата 19.3.2012, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



sergioK1, начни с хидера deque. А дальше уже тебя IDE направит.
PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.