C ++ многомерная обработка данных - PullRequest
1 голос
/ 03 марта 2009

Часто мне приходится определять контейнер для многомерных данных.

Давайте рассмотрим пример: у меня много чипов, у каждого чипа много регистров, у каждого регистра много ячеек, и у каждой ячейки много транзисторов.

На каком-то этапе моей программы на C ++ я должен прочитать эти данные, а затем использовать их.

Я не могу использовать внешнее хранилище для этих данных: файл, база данных и т. Д.

Итак, я должен создать какой-нибудь многомерный контейнер STL? Карта карт векторов или что-то в этом роде ...?

Или я должен создать классы (структуры) для каждого из них? Класс Cell, содержащий вектор транзисторов, а затем класс Register, содержащий вектор ячеек и т. Д.? Но что, если позже я захочу получить доступ к своим данным через транзистор, а не через чип?

Есть другой способ?

Спасибо

РЕДАКТИРОВАТЬ: Забыл упомянуть: я не могу использовать повышение.

Ответы [ 4 ]

5 голосов
/ 03 марта 2009

Вам необходимо сопоставить свой домен.

Итак, я должен создать какой-нибудь многомерный контейнер STL? Карта карт векторов или что-то в этом роде ...?

Каждый вектор / карта будет содержать объекты некоторого типа. Это подводит нас к следующему вопросу:)

Или я должен создать классы (структуры) для каждого из них?

Похоже, это то, что вам нужно как минимум.

Класс ячеек, содержащий вектор транзисторов, а затем класс Register, содержащий вектор ячеек и т. Д.?

Посмотрите на has-a и is-implemented-in-terms-of дизайнов.

Но что, если позже я захочу отсортировать данные по транзистору, а не по чипу?

Какие данные? Вы всегда можете обойти компараторы в зависимости от контекста. Кроме того, спросите себя, действительно ли вам нужно раскрывать детали уровня Transistor кому-то, кто работает с Chip. Это поможет начать.

4 голосов
/ 03 марта 2009

Реализация полных классов для них. В конце ваш код будет чище.

Всякий раз, когда я игнорирую эту аксиому, она возвращается, чтобы преследовать меня. Я реализовал иерархическую трехуровневую коллекцию строк в терминах std :: pair of std :: strings и std: pair. Это было быстро и просто, и когда мне пришлось заменить один слой, а затем другой на класс, содержащий дополнительные атрибуты, это было удивительно легко сделать. Но в конце код был беспорядком, и я не был счастлив документировать это. Урок усваивается снова, и снова, и снова ...

1 голос
/ 04 марта 2009

В соответствии с рекомендациями я решил реализовать полные классы:

class Chip
{
    map<RegisterLocation, Register> RegistersPerLocation;
  public:
    void AddRegisterPerLocation(RegisterLocation, Register); 

};

class Register
{
    map<CellLocation, Cell> CellsPerLocation;
  public:
    void AddCellPerLocation(CellLocation, Cell); 
};

// etc..
1 голос
/ 03 марта 2009

Если вы хотите получить доступ к вашим данным по различным «измерениям», вас может заинтересовать boost::multi_index_container. Я сам этим не пользовался, но, похоже, это отвечает всем требованиям.

...