Unordered array
От: Kingofastellarwar Украина  
Дата: 23.11.16 17:15
Оценка:
а в стд есть вообще контейнер, который работает как вектор, но при удалении элемента не сдвигает данные, а просто помнит что тут пусто, и следующую вставку сделает в это место
типа как список тока без постоянных выделений/удалений памяти
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re: Unordered array
От: andrey.desman  
Дата: 23.11.16 17:18
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>а в стд есть вообще контейнер, который работает как вектор, но при удалении элемента не сдвигает данные, а просто помнит что тут пусто, и следующую вставку сделает в это место

K>типа как список тока без постоянных выделений/удалений памяти

Так делает менеджер памяти.
Re: Unordered array
От: VTT http://vtt.to
Дата: 23.11.16 17:31
Оценка: +1
Здравствуйте, Kingofastellarwar, Вы писали:

K>а в стд есть вообще контейнер, который работает как вектор, но при удалении элемента не сдвигает данные, а просто помнит что тут пусто, и следующую вставку сделает в это место


Характерной особенностью массивов (и вектора) является хранение всех элементов непрерывно друг за другом в одном блоке памяти.
Дырок в нем быть не может.

K>типа как список тока без постоянных выделений/удалений памяти


Так список или массив?
Если хочется обойтись без постоянных выделений памяти, прикрутите к нему свой аллокатор.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: Unordered array
От: LaptevVV Россия  
Дата: 23.11.16 18:26
Оценка:
K>а в стд есть вообще контейнер, который работает как вектор, но при удалении элемента не сдвигает данные, а просто помнит что тут пусто, и следующую вставку сделает в это место
K>типа как список тока без постоянных выделений/удалений памяти
Можно использовать хеш-таблицу.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Unordered array
От: Wawan Россия http://www.wawan.ru/resume
Дата: 23.11.16 18:32
Оценка: +3
если порядок не важет то для скорости можно переносить последний элемент на место удаленного, и удалять последний
Re[2]: Unordered array
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.11.16 18:48
Оценка:
Здравствуйте, Wawan, Вы писали:

W>... и удалять последний

можен не надо?
не лучше ли просто сдвигать указатель конца?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Unordered array
От: Evgeny.Panasyuk Россия  
Дата: 23.11.16 18:58
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>а в стд есть вообще контейнер, который работает как вектор, но при удалении элемента не сдвигает данные, а просто помнит что тут пусто, и следующую вставку сделает в это место


А какие операции вообще требуются? index-access? обход всех живых?

K>типа как список тока без постоянных выделений/удалений памяти


Степанов рассказывал что он именно таким и хотел сделать изначальный list, и далее показывает пример реализации list_pool — как раз несколько списков поверх одного вектора.

Можно взять обычный std::list, точнее два — в одном будут живые элементы, а во втором пустые/мёртвые. Когда нужен новый — делаешь std::list::splice для переноса узла из одного списка в другой.
Чтобы не было постоянных выделений памяти (при нехватке пустых узлов) — предварительно заполни список-донор нужным количеством пустых элементов. Но естественно решение на базе vector'а было бы лучше.

Можно взять Boost.Pool — там внутри ЕМНИП есть реализация на базе массивов+freelist — его можно комбинировать со std::list, либо использовать напрямую.
Re: Unordered array
От: Кодт Россия  
Дата: 26.11.16 19:02
Оценка:
Здравствуйте, Kingofastellarwar, Вы писали:

K>а в стд есть вообще контейнер, который работает как вектор, но при удалении элемента не сдвигает данные, а просто помнит что тут пусто, и следующую вставку сделает в это место

K>типа как список тока без постоянных выделений/удалений памяти

Если дорогая операция именно сдвига элементов, то делается на коленке: вектор данных (самодельная куча), и вектор индексов и вакансий.
std::vector<T> items;
std::vector<size_t> indices;  // indices.size() == items.size()
size_t count;  // indices[0..count) - данные, indices[count..indices.size()) - вакансии

T& at(size_t i) {
  assert(i < count);
  return items[indices[i]];
}

void erase(size_t i) {
  assert(i < count);
  // переносим индекс освободившегося элемента в зону вакансий, сдвигая всё влево
  std::rotate(indices.begin()+i, indices.begin()+i+1, indices.begin()+count);
  // уменьшаем количество элементов
  --count;
}

void insert(size_t i, T&& t) {
  // заполняем вакансию
  if (count == indices.size()) {  // или создаём и тут же заполняем
    items.push_back(t);
    indices.push_back(count);
  } else {
    items[indices[count]] = t;  // вот так выглядит постусловие этого шага
  }
  // увеличиваем количество элементов
  ++count;
  // переносим индекс добавленного элемента в точку вставки - сдвигаем всё вправо
  std::rotate(indices.rend()-i-1, indices.rend()-i-2, indices.rend()-count-1);
}


(писал слёту, не тестировал, — если накосячил в ±1, простите).

Если элементов так много, что дорогим оказывается любой сдвиг (даже в массиве индексов), — то надо делать многоярусные страничные структуры данных.
Тогда сдвиг захватит только одну страницу дерева, ну или в худшем случае — стопку страниц от листа до корня, если это был последний элемент в этом поддереве.
Перекуём баги на фичи!
Re[2]: Unordered array
От: Evgeny.Panasyuk Россия  
Дата: 27.11.16 08:43
Оценка:
Здравствуйте, Кодт, Вы писали:

К>
К>T& at(size_t i) {
К>  assert(i < count);
К>  return items[indices[i]];
К>}
К>


Непонятно что именно нужно ТС — ибо в сабже "unordered", а видимо значит можно обойтись без дорогой items[indices[i]]. Может ему нужен просто список под которым пул узлов в векторе, а может даже и список не нужен, а просто быстрые allocate/deallocate для фиксированного размера.
Re[3]: Unordered array
От: Wawan Россия http://www.wawan.ru/resume
Дата: 09.12.16 19:36
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Wawan, Вы писали:


W>>... и удалять последний

X>можен не надо?
X>не лучше ли просто сдвигать указатель конца?
деструктор элемента вызывать надожеж
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.