Контейнер с random access и быстрым удалением
От: Аноним  
Дата: 14.09.10 08:27
Оценка:
Есть ли в мире c++ сабж?

Например, вектор является random access, но удаление посредством erase из середины очень тормозит.



21.10.10 20:14: Перенесено модератором из 'C/C++' — Odi$$ey
Re: Контейнер с random access и быстрым удалением
От: Sni4ok  
Дата: 14.09.10 08:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть ли в мире c++ сабж?


А>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.


boost::multi_index попробуйте.
Re: Контейнер с random access и быстрым удалением
От: hotdox  
Дата: 14.09.10 08:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть ли в мире c++ сабж?


А>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.


Вектор указателей.
Re: Контейнер с random access и быстрым удалением
От: Mazay Россия  
Дата: 14.09.10 09:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть ли в мире c++ сабж?


А>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.


Оборачиваешь обычный вектор. При удалении из середины не сдвигаешь весь хвост, а затираешь удаленный элемент последним, а последний удаляешь.
Лучше опиши задачу целиком. Сабжа недостаточно.
Главное гармония ...
Re: Контейнер с random access и быстрым удалением
От: Erop Россия  
Дата: 14.09.10 09:08
Оценка: -2
Здравствуйте, Аноним, Вы писали:

А>Есть ли в мире c++ сабж?

А>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.

1) С++ тут не при чём. Структуры данных не зависят от языка
2) Какая-нибудь иерархическая структура. Например, B-дерево.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Контейнер с random access и быстрым удалением
От: gegMOPO4  
Дата: 14.09.10 09:48
Оценка: 4 (2) +1
Здравствуйте, Аноним, Вы писали:

А>Есть ли в мире c++ сабж?

А>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.

Стандартного контейнера нет, но операцию быстрого удаления реализовать легко:
template<typename C>
void fast_erase1( C c, int i )
{
   c[i] = c.back();
   c.pop_back();
}

Или
template<typename C>
void fast_erase2( C c, int i )
{
   swap( c[i], c.back() );
   c.pop_back();
}

Где c — вектор.

В зависимости от типа элементов будет эффективнее один или другой вариант. Можно, конечно, и контейнер-обёртку сделать.
Re: Контейнер с random access и быстрым удалением
От: _wf Россия  
Дата: 14.09.10 10:57
Оценка: +1 -2
Здравствуйте, Аноним, Вы писали:

А>Есть ли в мире c++ сабж?


А>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.


std::deque?
Re[2]: Контейнер с random access и быстрым удалением
От: Мишень-сан  
Дата: 14.09.10 12:14
Оценка: -1
Здравствуйте, _wf, Вы писали:

_wf>Здравствуйте, Аноним, Вы писали:


А>>Есть ли в мире c++ сабж?


А>>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.


_wf>std::deque?


1. Фиговый или вообще нет random access
2. Фиговое или вообще нет удаление из середины
Re[2]: Контейнер с random access и быстрым удалением
От: Erop Россия  
Дата: 14.09.10 12:32
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

А>>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.


MOP>Стандартного контейнера нет, но операцию быстрого удаления реализовать легко:

MOP>В зависимости от типа элементов будет эффективнее один или другой вариант. Можно, конечно, и контейнер-обёртку сделать.

Обычно, от random access ждут сохранения порядка...
Хотя кто его знает, что там ТС надо на самом деле.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Контейнер с random access и быстрым удалением
От: gegMOPO4  
Дата: 14.09.10 13:40
Оценка:
Здравствуйте, Erop, Вы писали:

E>Обычно, от random access ждут сохранения порядка...

E>Хотя кто его знает, что там ТС надо на самом деле.

Это уже совершенно отдельное требование. Итераторы вот тоже инвалидируются при вставке или удалении из контейнера, но это же не мешает произвольному доступу. И даже индексы. Тут то же самое. Нужно знать, чего ты хочешь, и на что можешь рассчитывать.
Re[3]: Контейнер с random access и быстрым удалением
От: _wf Россия  
Дата: 14.09.10 13:54
Оценка:
Здравствуйте, Мишень-сан, Вы писали:

МС>Здравствуйте, _wf, Вы писали:


_wf>>Здравствуйте, Аноним, Вы писали:


А>>>Есть ли в мире c++ сабж?


А>>>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.


_wf>>std::deque?


МС>1. Фиговый или вообще нет random access

МС>2. Фиговое или вообще нет удаление из середины

я чего-то не понимаю?

deque::operator[]
// skipped
Complexity
Constant.

deque::erase
// skipped
Complexity
Linear on the number of elements erased (destructors). Plus, depending on the particular library implemention, additional linear time in up to the number of elements between position and one of the ends of the deque.

Re[4]: Контейнер с random access и быстрым удалением
От: Тот кто сидит в пруду Россия  
Дата: 14.09.10 14:01
Оценка:
Здравствуйте, _wf, Вы писали:

_wf>>>std::deque?


МС>>1. Фиговый или вообще нет random access

МС>>2. Фиговое или вообще нет удаление из середины

_wf>я чего-то не понимаю?


_wf>

_wf>deque::operator[]
_wf>// skipped
_wf>Complexity
_wf> Constant.

_wf>deque::erase
_wf>// skipped
_wf>Complexity
_wf> Linear on the number of elements erased (destructors). Plus, depending on the particular library implemention, additional linear time in up to the number of elements between position and one of the ends of the deque.


В мелкософтовской/динкумваровской реализации дека размер корзины выбран какой-то совершенно несуразный, поэтому дек на практике вырождается в список. Отсюда и непонятки.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Контейнер с random access и быстрым удалением
От: Vain Россия google.ru
Дата: 14.09.10 19:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть ли в мире c++ сабж?

А>Например, вектор является random access, но удаление посредством erase из середины очень тормозит.
Деревья или хешированные списки. Смотря насколько быстро нужно делать random access и random erase.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.