Ответ 1
Для создания с нуля (очень большая царапина) попробуйте Boost Multi-index Container. Это не реализация базы данных, но она может помочь.
Может ли кто-нибудь рекомендовать облегченную структуру данных таблиц С++ с открытым исходным кодом, которая имеет доступ к данным, подобный таблице базы данных? (т.е. 2D-массив, но с именованными столбцами - в идеале каждый столбец будет содержать данные одного типа [см. ниже]).
Я быстро просмотрел Google, но не нашел ничего полезного.
Как я вижу, это доступные мне варианты:
Итак, я выбираю самый быстрый маршрут (надеюсь, тот, который также будет самым эффективным использованием моего времени), поскольку все, что рекомендуется здесь, скорее всего, будет рассмотрено экспертами).
Итак, может ли кто-нибудь рекомендовать класс/набор классов С++, который предоставляет интерфейс "таблицы базы данных"?
Основные требования:
[EDIT]
Чтобы еще раз продемонстрировать, как я хочу использовать библиотеку, см. псевдо-код ниже, чтобы увидеть простое использование такого класса (простое, то есть теперь итерация строк и столбцов), что было бы действительно круто). На данный момент просто держать вещи простыми:
typedef MemoryTable::ColType ColumnType;
table = new MemoryTable();
// Set up the structure (this can be modified later using removeColumn() etc
table->addColumn(ColumnType::Integer, 'id');
table->addColumn(ColumnType::String, 'name');
table->addColumn(ColumnType::Boolean, 'gender');
table->addColumn(ColumnType::Double, 'weight');
for (size_t i=0; i<10; i++)
{
table->addRow();
numrows = table->getNumRows();
std::cout << "We now have " << numrows << " rows.\n";
// Note can access cells using column name or index
// Also using generic value getter/setter methods. Can throw exception on type mismatch
table->setValue(i, 'id', i*i);
table->setValue(i, 'name', getRandomSimpsonCharacterName());
//just to show use of a getter method
table->setValue(i, 'gender', checkGender(table->getValue(i, 'name')));
table->setValue(i, 3, guessWeight(table->getValue(i, 'name')));
}
Для создания с нуля (очень большая царапина) попробуйте Boost Multi-index Container. Это не реализация базы данных, но она может помочь.
Я бы пошел с sqlite или DB Berkeley. Они быстрые, предназначены для работы с таблицами "в памяти". Google для "встроенной базы данных" для других опций.
Может ли std::vector<std::vector<std::string/boost::any?> >
быть кандидатом?
Это не ответ, поэтому, пожалуйста, не поднимайте и не пропустите его - это просто самый простой способ ответить на один из вопросов OP, который не будет вписываться в комментарий:
#include <iostream>
#include "a_table.h"
using namespace std;
using namespace ALib;
int main()
{
Table table;
table.AddColumn( Column( "id", Column::Integer ));
cout << "We now have " <<table.Depth() << " rows.\n";
TableRow row;
row.push_back( TableValue( 42 ) );
table.AddRow( row );
cout << "We now have " <<table.Depth() << " rows.\n";
string s = table.Value( 0, 0 ).AsString();
cout << "row[0][0] is " << s << "\n";
cout << "id[0] value is "
<< table.Value( table.ColumnIndex("id"),0).AsInteger();
}
Лично я бы использовал std::map
. Просто создайте тип объекта, который представляет строку:
struct person {
int id;
std::string name;
bool gender;
double weight;
};
std::map<std::string, person> table;
// ... insert data, etc.
std::cout << "Homer is " << table["Homer"].weight << " lbs.\n";
person p = table["Marge"];
Если вы хотите что-то умнее std::map
(мой другой ответ), вы можете рассмотреть Berkeley DB, NetCDF, HDF5, тривиальная база данных или аналогичные библиотеки. К сожалению, они часто генерируют файлы, которые, по-видимому, нарушают заголовок вопроса.
Вы также можете быть заинтересованы в встроенных системах, таких как встроенный MySQL, встроенный Firebird или SQL Server Compact.