Реализация таблиц в C ++ - PullRequest
       4

Реализация таблиц в C ++

3 голосов
/ 25 ноября 2010

В нашем проекте C ++ мне нужна некоторая комбинированная структура данных, я думаю, она должна быть очень похожа на таблицу SQL.У меня есть набор массивов (std :: vectors) одинакового размера с разными типами данных.Например:

time(int), X(double), Y(double), valid(boolean), number_of_measurements(int)

Давайте представим, что они как таблица, мне нужен доступ к ним по строкам.Например, мне нужна функциональность для вставки строки в произвольную позицию таблицы, которая вызовет смещение всех строк на один элемент вниз, уничтожение строки.Мне может понадобиться отсортировать таблицу по времени, объединить ее с другими таблицами того же типа.

Есть ли что-нибудь подобное в мире C ++?

По сути, мне нужно универсальное решение, которое поддерживает любое количество столбцов и строк.И, конечно, производительность имеет смысл, поэтому я предпочитаю делать это скорее в памяти, чем в базе данных.

ОБНОВЛЕНИЕ

Я вижу, что многие люди предлагают определить простую строкуструктурировать и хранить его в коллекции.Нет, это не улетит так далеко, как мне нужно часто оперировать столбцами.Например, мне может понадобиться умножить весь столбец или вычислить из него среднее значение.Я могу даже интерполировать его или применить много разных алгоритмов к определенному столбцу.

И я хочу избежать ситуации, когда я извлекаю столбец из вектора, применяю к нему некоторые алгоритмы и затем возвращаю его обратно в структуру,Это выглядит ужасно, не правда ли?

Мне нужно более или менее похоже на это:

// Initializing: (three columns: time, X, Y)
table t("time", std::vector<int>(), "X", std::vector<double>(), "Y", std::vector<double>());

// inserting a row
t.insert_row( 1, 20.0f, 20.0f );

// accessing values:
t["time"][10] = 20;

// getting a column:
std::vector<int> time = t["time"];

// sorting
t.sort_by( "time" );

Есть мысли?

Ответы [ 4 ]

5 голосов
/ 25 ноября 2010

Если вам нужно что-то похожее на SQL, вы можете попробовать SQLite . Это библиотека, которая может предоставить базу данных SQL в памяти с возможностями SELECT, сортировкой, объединением и почти всеми основными операциями, которые вы ожидаете от базы данных SQL. Он также поддерживает файловые базы данных. Это должно сэкономить вам время на внедрение собственного решения.

3 голосов
/ 25 ноября 2010
struct Point
{
   int time;
   double X,Y;
   bool valid;
   int number_of_measurements;
};

std::vector<Point> your_table;

Не стоит забывать: std::vector имеет операции для вставки и удаления. Для сортировки и объединения включите заголовок "algorithm" из библиотеки std.

РЕДАКТИРОВАТЬ: если вы ищете базу данных в памяти, особенно для C ++, я нашел одну с именем "FastDb":

http://www.garret.ru/fastdb.html

(У меня нет личного опыта с этим, поэтому я не могу сказать вам, «как быстро».)

2 голосов
/ 25 ноября 2010

Создать класс с членами time, X, Y, valid, number_of_measurements Поместите объекты в std::vector или std::list.

0 голосов
/ 25 ноября 2010

То, что вы описываете, это структура для хранения данных строки, но массив для представления этой строки. Вы должны инкапсулировать эту структуру в класс, чтобы управлять этим способом. Если вы пытаетесь обобщить, я настоятельно рекомендую вам иметь дело с указателями, а не со структурами, по той простой причине, что управлять удалением и добавлением строк намного проще, если вам не нужно беспокоиться о том, какой у него размер.

Более того, создайте класс абстрактных строк, который определяет интерфейс (например, getColumn (int index)), который расширяется классом, который инкапсулирует это поведение с учетом структуры. Используйте класс std :: vector для обработки списка этих абстрактных строк и инкапсулируйте его в абстрактную таблицу с простым интерфейсом.

Абстракция - твой друг здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...