2010-11-25 69 views
3

在我們的C++項目中,我需要一些組合的數據結構,我認爲它應該與SQL表非常相似。我有一組具有不同數據類型的相同大小的數組(std :: vectors)。例如:在C++中的表實現

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

讓我們假裝他們就像一張桌子,我需要有一個行級訪問權限。例如,我需要一個功能來插入一行到表中的任意位置,這將導致一個元素上的所有行向下移動,從而終止行。我可能需要按時間對錶格進行排序,並將其與其他相同類型的表格合併。

在C++世界中是否有類似的東西?

基本上我需要一個通用的解決方案,它支持任意數量的列和行。當然,性能是有意義的,所以我寧願在內存中而不是在數據庫中。

UPDATE

我看到很多人都提出要定義一個簡單的排結構,並將其存儲收藏。不,我不需要經常使用色譜柱操作。例如。我可能需要乘以整列或計算其平均值。我甚至可以插入它或在某個列上應用許多不同的算法。

我想避免一種情況,當我提取一列到一個向量,應用一些算法,然後把它放回結構。它看起來很醜陋,不是嗎?

我需要這或多或少類似:

// 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"); 

有什麼想法?

+3

不要試圖模仿C++中的SQL表,它不會起作用。仔細考慮對象中的屬性,然後將對象存儲在集合中。 – Tony 2010-11-25 11:58:06

回答

2

與會員做一個類time,X,Y,valid,number_of_measurements。將對象放入std::vectorstd::list

3
​​

不要忘記:std::vector有插入和刪除的操作。對於排序和合並,請包含標準庫中的"algorithm"標題。

編輯:如果你正在尋找一個內存數據庫,尤其是對於C++,我發現了一個名爲「FASTDB」:

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

(我有沒有親身經歷,所以我不能告訴你「速度有多快」。)

+0

當您需要在整列上做某些事情時,這很糟糕。在我們的項目中,我們經常需要使用列進行操作。例如計算列的平均值或對其進行插值。這應該經常發生。 – 2010-11-25 16:23:42

+0

那麼,這個東西是在內存中,你可以遍歷矢量元素沒有太多的麻煩。如果這變得太慢,只要沒有改變,就可以使用緩存結果而不是「新鮮」計算來獲得已經請求的值。 – TheBlastOne 2010-11-25 16:49:00

+0

不是。我有很多像這樣的東西,這似乎很關鍵。請參閱原始消息 – 2010-11-25 16:50:37

5

如果你需要類似SQL的東西,你可以試試SQLite。這是一個庫,它可以提供內存SQL數據庫的SELECT功能,對SQL數據庫進行排序,合併和幾乎所有的基本操作。它還支持文件支持的數據庫。這應該爲您節省實施自己的解決方案的時間。

0

你描述的是一個結構來保存一行的數據,但一個數組來表示該行。你需要將這個結構封裝到一個類中來管理它。如果你想概括一下,我強烈建議你處理指針而不是結構,原因很簡單,當你不必擔心它可能具有的大小時,管理刪除和添加行變得更容易。

更好的是,製作一個抽象的行類,它決定了接口(例如getColumn(int index)),它由一個封裝給定結構的行爲的類擴展。使用std :: vector類來處理這些抽象行的列表,並用簡單的接口將其封裝到抽象表中。

抽象是你的朋友在這裏。