![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
как это будет на С++ не словах, mess , как ?, внутри вектора есть обьест, который при добавке умножает память на 2, как мне этот обьект получить ? пример если не трудно положите Это сообщение отредактировал(а) sergioK1 - 12.3.2012, 09:32 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
mes
самого вектора достаточно.. http://liveworkspace.org/code/ba491fe1c0f7...622e759b9282854 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
В векторе же не только пуш-бек, добавлять может
там еще придется "костылировать"... Добавлено через 3 минуты и 54 секунды sergioK1, вам имхо нужен не вектор. рассмотрите возможность использования deque. |
|||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
там еще придется "костылировать" А это на каком языке ? Alocator для чего? только не говорите что мне он не нужен (так многие говорят, и пугают им как бабой ягой как с ним работать? , примерчик если не сложно |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Для выделения/удаления памяти и инициализации объектов на ней. Стандартный Allocator аналогичен связке из new/delete и конструктора и деструктора для произвольного класса (для этого там используются шаблонные функции). Свой Allocator нужен если вы хотите изменить стандартный менеджер памяти для конкретных экземпляров контейнера (например сделать память на пуле, а не в куче) На внутреннее функционирование контейнеров Allocator не влияет Добавлено через 43 секунды На С++ - std::deque<> - стандартный контейнер |
|||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
1) Что значит фраза из предыдушего поста , "там придеться костылить"
2) разницу между деком и вектором не понимаю , дока пишеть что more efficient , видимо доступ вместо O(n) O(log2) или O(1) , ну и инсерт хуже соответсвенно , методы у обоих класов одинаковые, а что там мор когда и на сколько?, |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
sergioK1,
|
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
то что, в вектор добавлять придется не стандартной процедурой: vector.push_back (element); а костылем: my_push_back (vector, element); Кроме-то в вектор могут добавлять и другие методы. Их тоже нужно переписывать. Извиняюсь за придуманное слово "костылировать" Насчет дека, добалю к тому что сказал bsa, у него есть один недостаток, по сравнению с вектором: Данные расположены не непрерывно. Второй недостаток это несколько медленное время доступа к центральным элементам. (По опыту скажу, не на много медленее, по крайней мере в студии) Преимущества: Выделят блоки примерно так как вы хотите, порциями. Все прежде выделенные блоки остаются на своих местах, никаких гигантских перераспределений памяти (как в векторе) не бывает. Вообще ведет себя довольно ровно, в отличии от вектора. Последний, при достаточном размере, может в буквальном смысле подвесить программу на n-ое кол-во секунд, с требованиями трехкратного запаса памяти. Как это происходит: Допустим вектор имеет размер 1000, постпупил еще 1 элемент, в этот момент он затребует 2000 памяти, (1000+2000=3000), потом откопирует, и только потом освободит 1000. То есть, есть момент когда нужен 3-кратный запас по памяти. Кстати, в вашем случае с my_push_back(), нужен будет 2 кратный+100 запас (1000+1100=2100), но и перераспределения будут происходить чаще. |
|||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Так Deck - это получаеться линк лист где вместо нода массив каждый раз разного размера где последний елемент , указывает на первый в следующем , т,е в сранение с просто линк листом , доступ к елеметам внутри блока будет О(1)(по индексу), т,е у линк листа это всегдаO(n) а в деке как , зная размер каждого блока , сразу будет искать в нужном , ? т,е O(average(blockSize) , т,е, при вызове скажем D[5296] он знает что надо пойти в 38 блок , а там все 150 элеметов, но это если данные порциями приходят, скажем по 50 элеметов в среднем , но если придут по 5 то это мало что даст, т,е, в плане выделения памяти он ведет себя как линк лист в плане доступа как обычный массив, т,е применять его можно когда четко знаешь что у тебя за данные , Кажеться сам себе ответил да еще Так тут не один способ релизаций может быть , у каждого поставщика компайлера свой, а вектор (если нельзя изменить *2 ) это зло наверняка есть либы где , push back и resize виртуальные , или Я чего пропустил , |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это используется для неизвестного кол-ва данных.. Если есть предположения о кол-ве входящих данных, то нужна своя стратегия увелечения данных.. Более того бывают случаи, когда удобно пользоваться не одним типом контейнера, а смешанным в зависимости от подзадачи.. Например считать данные в деку, чтоб избежать лишнего копирования при перераспределении, а после поместить все в вектор уже нужного размера, чтоб иметь возможность прямого доступа.. |
|||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Все ясно всем спасибо, выяснил даже больше чем хотел, закрываем лавочку Это сообщение отредактировал(а) sergioK1 - 14.3.2012, 22:46 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
deque (от double ended queue - двусторонняя очередь) это примерно вектор указателей на фиксированные вектора. Т.е. когда ты добавляешь в дек данные, а у него нет под них места, то выделяется блок данных фиксированного размера, и в него уже добавляются данные. Указатель на свежевыделенный блок попадает в вектор указателей. Для вычисления элемента по индексу достаточно ему выполнить: ptr_vector[idx / blk_data_size][idx % blk_data_size]; Как ты понимаешь, время константно. Это сообщение отредактировал(а) bsa - 19.3.2012, 13:27 |
|||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Понимаю , сам такое когда-то изобретал на С , Реализацию где посмотреть ? от поставщика , Это сообщение отредактировал(а) sergioK1 - 19.3.2012, 16:11 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
sergioK1, начни с хидера deque. А дальше уже тебя IDE направит.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |