
KrivdaTheTriewe
14.05.2016
15:17:35
Я там сейчас работаю

Andrei
14.05.2016
15:18:00
Да, я и сказал, это для людей, которые могут.

adam
14.05.2016
18:43:23
...

Ned Ogl
14.05.2016
22:19:37
как реализовать stl::vector с доступом к элементу за O(1)?

Google

KrivdaTheTriewe
14.05.2016
22:31:12
Хэштаблица

Anatoly
14.05.2016
22:41:59

Ned Ogl
14.05.2016
22:45:25
В случае с двусвязкой, доступ дорогой
Нужен произвольный за 0(1)

Anatoly
14.05.2016
22:45:59
Эээ... ну массив же!

Ned Ogl
14.05.2016
22:46:25
Ну дык нужна динамичность
Я ж не могу его взять и рандомно удлинить...

Anatoly
14.05.2016
22:46:44
Ну так динамический массив!

Ned Ogl
14.05.2016
22:47:01
Дык он сразу длину приобретает... как это обойти?

Anatoly
14.05.2016
22:47:10
malloc, realloc?

Ned Ogl
14.05.2016
22:47:10
Изначально она должна быть нулевой
Кхэммм. ..

Google

Ned Ogl
14.05.2016
22:47:27
А реаллок не потрёт всё что было?

Anatoly
14.05.2016
22:47:58
При необходимости перевыделяй память, увеличивая капасити в 2 раза.
Реаллок не потрёт.

Ned Ogl
14.05.2016
22:48:30
А каков аналог реаллоку в С++?

Anatoly
14.05.2016
22:48:51
Но тут надо определиться, нужна ли работа только с простыми типами, или ещё и с объектами

Ned Ogl
14.05.2016
22:48:51
Или #include <cstdlib> ??

Сергей
14.05.2016
22:49:06
суть вектора в том, что при добоавлении он выделяет новую память и переносит данные

Anatoly
14.05.2016
22:49:21
Слу, а как насчёт посмотреть реализацию std::vector?

Ned Ogl
14.05.2016
22:49:41

Anatoly
14.05.2016
22:49:56

Ned Ogl
14.05.2016
22:50:08
Лан, спасибо

Anatoly
14.05.2016
22:50:20
Чегойта "долго"?

Ned Ogl
14.05.2016
22:50:36
Нулол, быстрей по двусвязке бегать

Anatoly
14.05.2016
22:50:42
Удваивать размер массива надо log (n) раз

Ned Ogl
14.05.2016
22:50:58

Сергей
14.05.2016
22:51:06
вот ведь авторы Stl глупцы

Ned Ogl
14.05.2016
22:51:23
Я всю жизнь удваиваю в два раза
Наверное что-то со мной не так?

Anatoly
14.05.2016
22:52:09

Google

Anatoly
14.05.2016
22:53:02

Ned Ogl
14.05.2016
22:53:49
Блин, нипанятна
Вроде понятно, а вроде и нет
Кстати, как пишут set?

Anatoly
14.05.2016
22:55:39
Чего непанятна-то? Если выделено памяти на 64 элемента, а нам нужен 65-ый, то выделяем память на 128, копируем 64 в новое место, и не чешемся, пока не будет нужно 129 элементов.
А потом 257. И 513. И 1025.

Ned Ogl
14.05.2016
22:55:59

Anatoly
14.05.2016
22:56:31
Почти как хешмеп, только одни keys, без values.
Указатели на свои члены, и т.д.

Ned Ogl
14.05.2016
23:01:00
Тык зачем их тогда трогать?
Лежат же на месте

Anatoly
14.05.2016
23:01:46
На старом месте. А на старом месте может не оказаться блока памяти подходящего размера.
И ваще
http://codereview.stackexchange.com/questions/60484/stl-vector-implementation
http://stackoverflow.com/questions/2096571/how-is-c-stdvector-implemented
И т.д.

Andrey
14.05.2016
23:08:14

Anatoly
14.05.2016
23:08:57
Не получится. И? Твой вариант?

Andrey
14.05.2016
23:09:31

Google

Anatoly
14.05.2016
23:10:58
Это не важно. Тупо performance/memory tradeoff.
Вот почему 1.5, а не 1.267?

Admin
ERROR: S client not available

Andrey
14.05.2016
23:11:57

Anatoly
14.05.2016
23:12:30
"Это не важно" (с) я

Andrey
14.05.2016
23:13:10
На логику это не влияет, но переиспользование памяти всё-таки надо делать.
Идеальным порогом будет 1/2 + sqrt(5) / 2
Хотя нет, вру.
А, нет. Не вру.

Anatoly
14.05.2016
23:16:10
Идеальным? Какую функцию должен минимизировать сей икс?
Чуть не забыл: в самом начале надо выделять не 1-2-4 элемента, а, скажем, сразу 8-16

Andrey
14.05.2016
23:17:44

Anatoly
14.05.2016
23:18:00
Лолшто?
Переиспользование возможно всегда.

Andrey
14.05.2016
23:18:42

Anatoly
14.05.2016
23:19:03
С чегойта? Я хоть с константой 100 смогу.

Andrey
14.05.2016
23:19:15
Если мы будем рассматривать только массив внутри памяти.
+ память фрагментироваться не будет.
Тоже в рамках одного массива.

Anatoly
14.05.2016
23:19:59

Google

Andrey
14.05.2016
23:20:21

Anatoly
14.05.2016
23:20:31
Так же как и с 2.
Новую память выделил, скопировал данные, старую освободил. Подходи, бери кому сколько надо.

Andrey
14.05.2016
23:21:08
1+2+...(2n - 2) < 2n

Anatoly
14.05.2016
23:21:25
Что это?

Andrey
14.05.2016
23:21:41
Херню написал.

Anatoly
14.05.2016
23:21:57
Да я вижу. Зачем ты её написал?

Andrey
14.05.2016
23:22:00
1 + 2 + 4 + 2^(n - 1) < 2^n
Так верно.

Anatoly
14.05.2016
23:22:24
Теперь верно. И?

Andrey
14.05.2016
23:22:57
У тебя на каждом шаге уже использованная память будет больше, чем тебе надо. Поэтому не сможешь переиспользовать.
С константой > 1/2 + sqrt(5) / 2, конечно же.