Создание карты & lt; Key, Map & lt; Key, Set & lt; Класс & GT; & GT; & GT; больно в C ++. Есть ли способ лучше?

Я привык к мышлению 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.

Эта карта является результатом функции поиска. После завершения поиска я оцениваю результаты и в отдельной функции записываю результаты в файл. Я разработал проект с учетом функционального программирования, и моей первоначальной попыткой было разделение структуры кандидата и структуры оценки. Это, однако, создало проблемы, так как я в основном воссоздаю всю структуру карты в памяти. Структура важна, когда все записано на диск.

Я мог бы связать оценки с итераторами в картах и ​​наборах, но, честно говоря, мне кажется, что я слишком усложняю вещи.

Спасибо!

* Отредактировано, чтобы иметь больше смысла для моих конечных целей.

2

Решение

Обратите внимание, что большая часть многословия вашего кода происходит от повторяющегося использования этой «последовательности и конфигурации пары» во всех именах. Это означает, что вам нужен термин для решения этой проблемы. Лучше всего использовать тот же термин, который используется в сленге проблемного домена, чтобы назвать его. Люди ленивы. Допустим, они называют это 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с и maps не достаточно сложны, то Boost.MultiIndex или же Boost.Graph предложить более сложные контейнеры. С другой стороны, когда map или же set остается неизменным большую часть времени, затем сортируется vector пар (вместо map) или отсортировано vector (вместо set) а также std::lower_bound может предложить лучшую производительность. копирование setс и maps гораздо дороже, чем копирование vectors.

3

Другие решения

Других решений пока нет …