Таблица памяти С++

Может ли кто-нибудь рекомендовать облегченную структуру данных таблиц С++ с открытым исходным кодом, которая имеет доступ к данным, подобный таблице базы данных? (т.е. 2D-массив, но с именованными столбцами - в идеале каждый столбец будет содержать данные одного типа [см. ниже]).

Я быстро просмотрел Google, но не нашел ничего полезного.

Как я вижу, это доступные мне варианты:

  • Напиши свой собственный с нуля (не очень хочется изобретать колесо)
  • вырвать класс SimpleResult из mySQL ++ и взломать его
  • используйте sqlite (не знаю, как это будет с LightWight - так как мне не нужен механизм запросов и все другие вещи)
  • Задайте здесь, чтобы узнать, знает ли кто-нибудь о такой библиотеке

Итак, я выбираю самый быстрый маршрут (надеюсь, тот, который также будет самым эффективным использованием моего времени), поскольку все, что рекомендуется здесь, скорее всего, будет рассмотрено экспертами).

Итак, может ли кто-нибудь рекомендовать класс/набор классов С++, который предоставляет интерфейс "таблицы базы данных"?

Основные требования:

  • У столбцов есть имена
  • Доступ к ячейкам можно получить с помощью индексов строк, столбцов
  • Я могу добавить строки и столбцы в таблицу (в идеале, я могу их удалить)
  • (Приятно иметь): столбцы могут иметь типы, поэтому они сохраняют стоимость преобразования в/из строк

[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')));
}

Ответы

Ответ 1

Для создания с нуля (очень большая царапина) попробуйте Boost Multi-index Container. Это не реализация базы данных, но она может помочь.

Ответ 2

Я бы пошел с sqlite или DB Berkeley. Они быстрые, предназначены для работы с таблицами "в памяти". Google для "встроенной базы данных" для других опций.

Ответ 3

Может ли std::vector<std::vector<std::string/boost::any?> > быть кандидатом?

Ответ 4

Это не ответ, поэтому, пожалуйста, не поднимайте и не пропустите его - это просто самый простой способ ответить на один из вопросов 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();
}

Ответ 5

Лично я бы использовал 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"];

Ответ 6

Если вы хотите что-то умнее std::map (мой другой ответ), вы можете рассмотреть Berkeley DB, NetCDF, HDF5, тривиальная база данных или аналогичные библиотеки. К сожалению, они часто генерируют файлы, которые, по-видимому, нарушают заголовок вопроса.

Вы также можете быть заинтересованы в встроенных системах, таких как встроенный MySQL, встроенный Firebird или SQL Server Compact.