Я привык к мышлению Python, когда речь идет об иерархической организации данных с использованием карт. Это просто и синтаксически дешево. Хотя вложенные карты / наборы не очень сложны в C ++, они затрудняют организацию. Я не думаю, что думаю о проблеме правильно.
В качестве примера я использую следующую организацию:
typedef set<Motif> Motifs;
typedef map<Motif, Motifs> LinkedMotifs;
struct Candidates {
Motifs deadend;
Motifs intralinked;
LinkedMotifs interlinked;
};
typedef map<Linker::shp, Candidates> LinkedCandidates;
Из соображений производительности я использую реализации boost_map / set. Мотив — это стандартная пара структур. Linker :: shp является SharedPtr.
Эта карта является результатом функции поиска. После завершения поиска я оцениваю результаты и в отдельной функции записываю результаты в файл. Я разработал проект с учетом функционального программирования, и моей первоначальной попыткой было разделение структуры кандидата и структуры оценки. Это, однако, создало проблемы, так как я в основном воссоздаю всю структуру карты в памяти. Структура важна, когда все записано на диск.
Я мог бы связать оценки с итераторами в картах и наборах, но, честно говоря, мне кажется, что я слишком усложняю вещи.
Спасибо!
* Отредактировано, чтобы иметь больше смысла для моих конечных целей.
Обратите внимание, что большая часть многословия вашего кода происходит от повторяющегося использования этой «последовательности и конфигурации пары» во всех именах. Это означает, что вам нужен термин для решения этой проблемы. Лучше всего использовать тот же термин, который используется в сленге проблемного домена, чтобы назвать его. Люди ленивы. Допустим, они называют это motif
и все становится намного проще:
typedef set<Motif> Motifs;
typedef map<Motif, Motifs> LinkedMotifs;
struct Candidates {
Motifs deadend;
Motifs intralinked;
LinkedMotifs interlinked;
};
typedef map<Linker::shp, Candidates> LinkersCandidates;
Я … использую короткие имена. Всегда помещайте каждое имя в пространство имен в C ++. C ++ обычно используется для
писать довольно большие продукты (миллион строк в среднем), и это помогает
избегать столкновений имен.
Если вам нужно повторно использовать эту организацию, вы можете использовать шаблон:
template<typename T>
struct Handler {
typedef set<T> Ts;
typedef map<T, Ts> LinkedTs;
struct Candidates {
Ts deadend;
Ts intralinked;
LinkedTs interlinked;
};
typedef map<Linker::shp, Candidates> LinkersCandidates;
};
typedef Handler<Motif>::LinkersCandidates LinkersMotifCandidates;
typedef Handler<Other>::LinkersCandidates LinkersOtherCandidates;
Проблемы с производительностью могут возникнуть, если вы используете копии, где вы должны использовать ссылки или указатели или если вы не выбрали правильные контейнеры. Например, когда set
с и map
s не достаточно сложны, то Boost.MultiIndex или же Boost.Graph предложить более сложные контейнеры. С другой стороны, когда map
или же set
остается неизменным большую часть времени, затем сортируется vector
пар (вместо map
) или отсортировано vector
(вместо set
) а также std::lower_bound
может предложить лучшую производительность. копирование set
с и map
s гораздо дороже, чем копирование vector
s.
Других решений пока нет …