Почему D отсутствует классы контейнеров?
Я использую контейнеры С++ 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
→ ?
Есть ли какие-либо планы по поддержке любого из отсутствующих?
Ответы
Ответ 1
Я считаю, что основным удержанием для получения большего количества контейнеров в std.container является то, что Андрей Александреску разбирался в том, как лучше справляться с пользовательскими распределителями, и он хочет это сделать, прежде чем внедрять все типы контейнеров, потому что в противном случае он будет требовать много изменений кода, как только он это сделает.
В то же время у вас есть встроенные массивы и ассоциативные массивы, а std.container содержит Array
(который по существу std::vector
), SList
(который является односвязным списком), RedBlackTree
(который может использоваться для любого типа набора или карты, в котором используется дерево - это то, что делают различные типы STL и типы карт) и BinaryHeap
.
Итак, нет никаких сомнений в том, что ситуация должна быть улучшена (и будет), но я не знаю, как скоро. В конце концов, std.container должен иметь типы контейнеров, которые соответствуют всем типам контейнеров STL.
Ответ 2
Контейнеры являются todo с точки зрения развития библиотеки в D, но никто не получил полную библиотеку контейнеров в Phobos, потому что никто не согласен с тем, что должен быть дизайн, и все, кто вносит вклад в стандартную библиотеку (которая быстро растет) нашел более интересные вещи для работы.
std::vector
→ array
как вы говорите
std::dequeue
, std::queue
: У нас пока нет, к сожалению.
std::stack
: это может быть тривиально реализовано поверх SList
или массива.
std::set
: это может быть тривиально реализовано поверх RedBlackTree
.
std::multiset
: Я думаю, что RedBlackTree
можно установить для дублирования.
std::unordered_set
: это может быть тривиально реализовано поверх встроенного ассоциативного массива. Чтобы реализовать его поверх встроенного АА, используйте byte[0][SomeType]
.
std::map
: может быть тривиально реализовано поверх RedBlackTree
.
std::multimap
: Вы можете использовать для этого массивы ассоциативных массивов.
std__unordered_map
: Используйте встроенные ассоциативные массивы.