HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.
LightList[T] — аналог SCG.List[T] который имеет смысл использовать когда в списке преимущественно 0 или 1 элемент, но может появляться и больше элементов. Коллекция является структурой и хранит первый элемент в собственном поле. Создан для упрощения алгоритмов в которых происходит накопление элементов, а потом в зависимости от их числа создается коллекция или единичный элемент данных. Пример использования.
Здравствуйте, VladD2, Вы писали:
VD>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.
Какой use-case?
VD>LightList[T] — аналог SCG.List[T] который имеет смысл использовать когда в списке преимущественно 0 или 1 элемент, но может появляться и больше элементов. Коллекция является структурой и хранит первый элемент в собственном поле.
Часта возникает ситуация когда есть много динамических массивов, причём размер большинства не превышает некоторый малый Threshold известный в compile-time. В таких случаях применяют small_vector<T, Threshold> (или аналоги), у которого внутри по сути variant<array<T, Threshold>, vector<T>> — это является общением твоего LightList.
VD>Создан для упрощения алгоритмов в которых происходит накопление элементов, а потом в зависимости от их числа создается коллекция или единичный элемент данных. Пример использования.
Насколько я вижу это не упрощение, а просто оптимизация
Здравствуйте, Evgeny.Panasyuk, Вы писали:
VD>>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.
EP>Какой use-case?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
VD>>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым.
EP>Какой use-case?
Когда нужно сделать элементы уникальными эта реализация может вернуть первый добавленный элемент. Можно сэмулировать на хэш-таблицы, но удобнее иметь специализированную коллекцию.
EP>Часта возникает ситуация когда есть много динамических массивов, причём размер большинства не превышает некоторый малый Threshold известный в compile-time. В таких случаях применяют small_vector<T, Threshold> (или аналоги), у которого внутри по сути variant<array<T, Threshold>, vector<T>> — это является общением твоего LightList.
Ну, это немного другая задача и на дотнете ее точно так же не решишь, так как дженерики не шаблоны. Разве что на макросах сбацать.
В коде компилятора немерла есть куча мест где LightList сдела бы код чище.
EP>Насколько я вижу это не упрощение, а просто оптимизация
Ну, оптимизация обычно есть уже в коде. Иначе можно было бы просто списки использовать. Обычно в коде присутствует говнокод с локальными переменными и проверками. Все это чтобы не создавать объект (список) для одного элемента. LightList делает это позволяя обойтись без говнокода.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>>>HashSetEx[T] — обертка над HashSet, позволяет узнать исходный элемент добавленный в коллекцию первым. EP>>Какой use-case? VD>Когда нужно сделать элементы уникальными эта реализация может вернуть первый добавленный элемент. Можно сэмулировать на хэш-таблицы, но удобнее иметь специализированную коллекцию.
А, то есть просто HashSet это АТД Multiset, а HashSetEx это реализация АТД Set, без повторяющихся значений.
Имена получились слишком громоздкие AddOrGetFirstAddedItem, TryGetFirstAddedItem — может лучше позаимствовать лаконичную терминологию из STL, или ещё откуда.
VD>Ну, это немного другая задача и на дотнете ее точно так же не решишь, так как дженерики не шаблоны. Разве что на макросах сбацать.
Тогда интересно как будет выглядеть функция принимающая хотя бы конкретное воплощение small_vector, то есть аналог:
void foo(small_vector<T, 11> &x)
{
// ...
}
Или даже её придётся описывать макросами?
VD>В коде компилятора немерла есть куча мест где LightList сдела бы код чище.
Это понятно.
VD>Ну, оптимизация обычно есть уже в коде. Иначе можно было бы просто списки использовать. Обычно в коде присутствует говнокод с локальными переменными и проверками. Все это чтобы не создавать объект (список) для одного элемента. LightList делает это позволяя обойтись без говнокода.
Понятно, то есть всё же оптимизация первична, пусть она и была ad-hoc.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>А, то есть просто HashSet это АТД Multiset, а HashSetEx это реализация АТД Set, без повторяющихся значений. EP>Имена получились слишком громоздкие AddOrGetFirstAddedItem, TryGetFirstAddedItem — может лучше позаимствовать лаконичную терминологию из STL, или ещё откуда.
Нет. Multiset хранит все "одинаковые" значения. Этот же, как и обычный, Set хранит только одно значение. Но в отличии от обычного Set-а он позволяет его получить обратно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Нет. Multiset хранит все "одинаковые" значения. Этот же, как и обычный, Set хранит только одно значение. Но в отличии от обычного Set-а он позволяет его получить обратно.
А обычный HaseSet разве не позволяет через TryGetValue?
Или суть только в том, чтобы сделать это одним вызовом? Тогда непонятно зачем нужен отдельный класс, достаточно простой функции.
Здравствуйте, pekabon, Вы писали:
P>Здравствуйте, VladD2, Вы писали:
VD>>PriorityQueue[T] — название говорит самое за себя —
P>Есть же Nemerle.Collections.Heap
Добавил в Heap возможность указать функцию-сравнивалку, убрал ограничение на IComparable[T].
Выкинул PriorityQueue за ненадобностью.