Почему в D отсутствуют классы контейнеров? - PullRequest
16 голосов
/ 23 августа 2011

Я привык к C ++ STL-контейнерам.У D есть массивы, ассоциативные массивы и строки, но где остальные?Я знаю о std.container, но, насколько я могу судить, у него есть только один контейнер, красно-черное дерево, которое я мог бы использовать, если бы мне нужно что-то похожее на std::set.Но что, если мне понадобится list?Я должен использовать вместо этого массив?

std::vector -> array

std::deque -> ?

std::queue -> ?

std::stack -> ? maybe array and std.container functions ?

std::priority_queue -> BinaryHeap

std::list -> ?

std::set -> std.container RedBlackTree

std::multiset -> ?

std::unordered_set -> ?

std::map -> associative arrays

std::multimap -> ?

std::unordered_map -> ?

Есть ли планы поддержать кого-либо из пропавших?

Ответы [ 2 ]

19 голосов
/ 23 августа 2011

Я считаю, что основным препятствием для получения большего количества контейнеров в std.container является то, что Андрей Александреску разбирается, как лучше всего обращаться с пользовательскими распределителями, и он хочет сделать это до реализации всех типов контейнеров, потому что в противном случае как только он это сделает, потребуется много изменений кода.

Тем временем у вас есть встроенные массивы и ассоциативные массивы, а std.container содержит Array (что по сути std::vector), SList (это односвязный список), RedBlackTree (который может использоваться для любого типа набора или карты, использующего дерево - что и делают различные типы набора и карты STL) и BinaryHeap.

Итак, нет сомнений в том, что ситуацию нужно улучшить (и она будет улучшена), но я не знаю, как скоро. В конце концов, std.container должен иметь типы контейнеров, которые соответствуют всем типам контейнеров STL.

9 голосов
/ 23 августа 2011

Контейнеры - это задача с точки зрения разработки библиотеки в D, но никто не получил всестороннюю библиотеку контейнеров на Фобосе, потому что никто не согласен с тем, каким должен быть дизайн, и все, кто вносит вклад в стандартную библиотеку (которая очень быстро росла) нашел более интересные вещи для работы.

std::vector -> array как вы говорите

std::dequeue, std::queue: К сожалению, у нас его еще нет.

std::stack: Это может быть тривиально реализовано поверх SList или массива.

std::set: Это может быть тривиально реализовано поверх RedBlackTree.

std::multiset: Я думаю, что RedBlackTree может быть установлен для разрешения дублирования.

std::unordered_set: Это может быть тривиально реализовано поверх встроенного ассоциативного массива. Чтобы реализовать его поверх встроенного AA, используйте byte[0][SomeType].

std::map: может быть тривиально реализовано поверх RedBlackTree.

std::multimap: Вероятно, для этого вы можете использовать ассоциативные массивы массивов.

std__unordered_map: использовать встроенные ассоциативные массивы.

...