2014-08-30 1 views
10

Я ищу язык программирования Rust и пытаюсь преобразовать мышление C++ в Rust. Общие структуры данных, такие как списки и деревья, и ранее были реализованы с указателями на C++, и я не уверен, как реализовать точные эквиваленты в Rust. Структуры данных, которые меня интересуют, - это интрузивные алгоритмы, аналогичные тем, которые встречаются в интрузивных библиотеках Boost, и они полезны во встроенном/системном программировании.Взаимозаменяемые алгоритмы в Rust

Пример связанного списка в Rust (Dlist) довольно прямолинейный, но он использует тип контейнера, где фактический тип находится внутри контейнера. Навязчивый алгоритм, который я ищу, немного наоборот: у вас есть основной тип, где узел списка вставлен или унаследован.

Кроме того, известный связанный список в Linux также является еще одним примером, когда данные списка находятся в элементах структур. Это похоже на вариант участника Boost для интрузивных алгоритмов. Это позволяет многократно использовать ваш тип в нескольких списках/деревьях. Как это будет работать с Rust?

Так что я не уверен, как преобразовать эти шаблоны дизайна в Rust, к которым я привык в C/C++. Любой, кто имел успех, понимал это?

+0

У меня нет большого опыта работы с этими типами структур данных, но можете ли вы объяснить некоторые преимущества, которые вы надеетесь получить, используя их? Если стандартные структуры Rust не подходят для ваших случаев использования, возможно, что-то еще будет. – Shepmaster

+0

Возможно, вы захотите посмотреть https://github.com/pcwalton/multilist, который реализует интрузивные структуры данных. – awelkie

ответ

1

Rust хочет, чтобы вы подумали о собственности и жизни. Кто владеет членами и как долго они будут жить?

В вопросе Dlist ответ «контейнер». С интрузивными алгоритмами нет четкого ответа. Члены одного списка могут быть повторно использованы в другом списке, а другие будут уничтожены с первым списком. В конечном счете, вы, вероятно, захотите использовать подсчет ссылок (std::sync::Arc).

1

Я думаю, что есть два способа добиться чего-то подобного в Rust. Давайте посмотрим на реализацию графиков, которые обычно используют навязчивые ссылки.

Первый подход основан на Rc<RefCell<Node>>. Вы можете найти более подробную информацию: Graphs and arena allocation

Второй подход основан на векторных индексах. Вы можете найти более подробную информацию здесь: Modeling Graphs in Rust Using Vector Indices.

Я считаю, что второй подход лучше, но я не проводил никаких испытаний.