Это тот разговор, который начался во время Boost. Формальный обзор PropertyTree. Обзор был очень интересным, и были затронуты очень глубокие темы. Это очень интересно, и сейчас это часть истории библиотеки. Наслаждайтесь!
Самым большим достоинством property_tree является простой в использовании интерфейс. Если мы попытаемся сделать его родовым деревом, он будет скомпрометирован.
Я имею в виду, почему мне нужно это полуиспеченное дерево как другая структура данных? Дерево собственности само по себе ничего не поддерживает. Это всего лишь структура данных. У вас есть парсеры, которые производят дерево собственности из разных источников. Но вы также создаете карты или что-то еще. Вот, например, все, что мне нужно сделать, чтобы «внедрить» такую же функциональность, как ваше дерево свойств:
// Data structure itselftemplate<typenameValueType,typenameKeyType>structNode;template<typenameValueType,typenameKeyType>structptree_gen{typedefstd::pair<KeyType,Node<ValueType,KeyType>>mi_value;typedefmulti_index_container<mi_value,indexed_by<...>>type;};template<typenameValueType,typenameKeyType>structNode{ValueTypev;ptree_gen<ValueType,KeyType>::typechildren;};// serialization supporttemplate<classArchive,typenameValueType,typenameKeyType>voidserialize(Archive&ar,Node<ValueType,KeyType>&n,constunsignedintversion){ar&n.v;ar&n.children;}// some access methodstemplate<typenameValueType,typenameKeyType>ValueTypeconst&get(stringconst&keys,ptree_gen<ValueType,KeyType>::typeconst&src){std::pait<string,string>sk=split(keys,".");Nodeconst&N=src.find(sk.first);returnsk.second.empty()?N.v:get(sk.second,N.children);}
То, что вы только что реализовали, является упрощенной версией property_tree, которая, среди прочего, не позволяет создавать редактируемые человеком XML-файлы. Теперь добавьте больше интерфейса (aka get functions), добавьте больше архивов в lib сериализации, добавьте кастомизацию, добавьте прозрачный перевод из строк в произвольные типы и наоборот. Проведите несколько недель, пытаясь исправить все угловые случаи, а затем еще несколько недель, пытаясь сгладить грубые края в интерфейсе. Затем напишите тесты. Пишите документы. В конце концов, я думаю, вы не получите гораздо меньше кода, чем в библиотеке уже есть. Вы можете сэкономить, используя мультииндекс вместо ручной индексации.
Хотя дерево имеет большой интерфейс со многими функциями, изменяющими состояние дерева, оно использует подход «единой точки изменения». Каждая вставка в конечном итоге проходит через одну функцию, которая заботится о безопасности исключений и синхронизации индекса с данными. То же самое относится и к стиранию. Эта функция имеет 9 строк кода в случае вставки, и (по совпадению) также 9 в случае стирания. При использовании мульти-индекса эти функции, очевидно, будут упрощены, возможно, до 4 строк каждая. Чистая прибыль: 10 строк кода (из нескольких сотен в ptree_implementation.hpp).
Я знаю, что есть прирост производительности, но в то время я сосредоточился на том, чтобы сделать интерфейс правильным.
Дэйв
Торстен
Я думаю, что важно сосредоточиться на интерфейсе в обзоре, но я также вижу несколько преимуществ реализации, которая основывается на Boost. MultiIndex:
Я еще не использовал опции программы. Но если я правильно понимаю, обе библиотеки поддерживают хранение и доступ к данным со строками, которые могут описывать какую-то иерархию. Это, кажется, основная идея обеих библиотек - это правильно?
Что я сам использовал вашу библиотеку дерева свойств для чтения и записи файла конфигурации. Это действительно было очень легко использовать. Однако было бы еще проще, если бы это было что-то, что я знал раньше, например, итератор. На данный момент я определенно буду использовать вашу библиотеку дерева свойств, но я был бы признателен, если бы существующие концепции были повторно использованы многими разработчиками C++. Я считаю, что ваша библиотека должна быть частью Boost, но должна быть более обобщенной в будущем.
Торстен
Павел
Торстен
Правильно, но реальная ценность приходит, когда кто-то разрабатывает хороший STL-подобный интерфейс и пишет документы и т. Д., По крайней мере, это было моей точкой зрения.
Дэйв
ИМО Торстен совершенно прав. Это именно то, что можно добавить в библиотеку в рамках ее текущего обслуживания и развития (без обзора, конечно).
Хоакин
Боюсь, у меня нет времени заниматься этим, так как нынешняя дорожная карта основных функций B.MI отнимает все свободное время, которое я могу посвятить библиотеке. По этой причине я хотел бы увидеть, как некоторые добровольцы прыгают, которые могут разрабатывать этот и другие уникальные контейнеры с использованием B.MI (на ум приходит контейнер с кэшем), а затем предлагать результаты здесь либо в качестве отдельной библиотеки как часть B.MI.
Если есть такой доброволец, я могу оказать ей помощь/наставничество. Мне также интересно, подходит ли эта задача для Google Summer of Code.
Торстен
Я думаю, что это было бы хорошо для SOC. B.MI заботится обо всех действительно трудных вещах, и поэтому для студента представляется разумным заполнить детали.
Дэйв
Джефф
Пожалуйста, напишите предложение!
Хоакин
Я только что это сделал:
Введение
Повышаю. MultiIndex позволяет строить сложные структуры данных с участием двух или более механизмов индексации на одном наборе элементов. Из неограниченного диапазона возможных структур данных, определяемых в Boost. MultiIndex, некоторые конфигурации возникают периодически:
а.Двунаправленная карта или бимап представляет собой контейнер элементов типа pair, где быстрый поиск обеспечивается как для поля T, так и для поля Q, в отличие от обычной карты STL, которая позволяет быстро искать только на T.
b.Перечень МРУ (наиболее недавно использованных) содержит n последних элементов, на которые ссылаются: когда новый элемент вставлен и список достиг максимальной длины, самый старый элемент стирается, тогда как если вставку пробуют из элемента предварительного существования, это продвигается в первую позицию. Например, списки MRU могут использоваться для реализации динамических кэшей и поведения, проявляемого программами с командой меню «Недавние файлы».
Несмотря на рост. MultiIndex предоставляет механизмы для построения этих общих структур, результирующий интерфейс может быть громоздким и слишком общим по сравнению со специализированными контейнерами, ориентированными на такие конкретные структуры.
Цель
Написать библиотеку специализированных контейнеров, как описано выше, с помощью Boost. MultiIndex как ядро реализации. Помимо бимапа и списка MRU, студент также может предложить другие специализированные контейнеры, представляющие интерес для сообщества. Ожидается, что библиотека соответствует стандартам качества, требуемым Boost для возможного включения в этот проект, что подразумевает сильный акцент на дизайн интерфейса, документацию и модульное тестирование; наставник будет направлять студента через полный цикл от сбора спецификаций и требований к документации и фактическому кодированию. Окончательный результат проекта должен содержать:
а.Промежуточный уровень в C++, с акцентом в общем программировании (шаблоны).
b.Знание основ STL и принципов проектирования. Конечно, знания о Boost в целом и Boost. MultiIndex является большим плюсом.
с.Знакомство как минимум с двумя различными средами программирования на C++.
d.Некоторая беглость в английском языке; последующие обзоры документации могут помочь сгладить неровные края здесь.
е.Математический наклон и предыдущее воздействие формального курса алгоритмов очень помогли бы.
f.Стремление к высококачественной работе.
Пособия для студента
Студент, принимающий участие в этом проекте, получит возможность изучить полный процесс производства программного обеспечения в уважаемом учебном заведении с открытым исходным кодом C++ и даже увидеть, как ее работа будет включена в Boost. Завершение проекта связано с нетривиальными проблемами в дизайне интерфейса C++ и так называемым современным программированием C++, высококачественной пользовательской документацией и единичным тестированием. Студент также узнает, возможно, к ее удивлению, что большую часть времени он будет тратить на то, чтобы собирать и пробовать идеи и, в целом, думать, а не писать настоящий код.
<And then... after long hours of coding (and fun) this library
saw the light.>
Статья MultiIndex and Bimap раздела Chapter 1. Boost.Bimap History может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.