2012-01-26 64 views
0

只有在容器具有類似於RDBMS怎麼不會讓你的關鍵屬性的一個元素來聲明 比上表中的一個主鍵多。 示例如下使用矢量(請考慮使用其他任何容器(stdboost),可以完成任務 典雅。如何強制執行primay鍵約束類似行爲STL容器的元素

struct Element 
{ 
    std::wstring val_; 
    bool key_; 
}; 
std::vector<Element> v; 
Element e1; 
e1.val_ = L"Jupiter"; 
e1.key_ = false; 
v.push_back(e1); 

Element e2; 
e2.val_ = L"Mars"; 
e2.key_ = true; 
v.push_back(e2); 

Element e3; 
e3.val_ = L"Venus"; 
e3.key_ = false; 
v.push_back(e3); 

Element e4; 
e4.val_ = L"Venus"; 
e4.key_ = false; 
v.push_back(e4); 

關鍵的要求是,例如,如果是由試圖使e3.key_ = true異常應因爲被拋出 E2(「火星」)已經扮演這個角色

注意,允許重複在該容器中。

+1

這功課嗎? – ildjarn

+2

你知道'std :: map'嗎? – Xeo

+0

@ildjarn。不,這不是一項功課。 – user841550

回答

3

如果你只想讓其中一人是一個關鍵,I W烏爾德從單個項目分開存儲密鑰的指示:

struct column_set { 
    std::vector<std::wstring> elements; 
    size_t key; 
}; 

column_set v; 
v.elements.push_back(L"Jupiter"); 
v.elements.push_back(L"Mars"); 
v.elements.push_back(L"Venus"); 
v.elements.push_back(L"Venus"); 
v.key = 1; 

如果你想,它應該是相當容易寫,其作用類似於布爾數組,將返回true一點點前端代碼指數等於您對keyfalse給出的任何其他值的值。

+0

謝謝。這種認識會做到這一點 – user841550

0

根據您的描述,它聽起來就像你正試圖使已存在的STL類處理更高級別的應用程序邏輯,爲您和這只是不會發生(至少不乾淨或優雅)。

我唯一的建議是類似於傑裏棺材建議的東西。

創建自己的類,它表示你的數據集。讓該類封裝列的向量(或地圖,列表...),但爲世界其他地方提供了一個非常乾淨的公共界面。在你的班級以外,任何東西都不應該知道里面有一個向量。其他代碼只與AddColumn,DeleteColumn,SetKey等公共函數對話。所以本質上你是創建你自己的定製容器,它使用STL來引導,但是擴展它來提供你需要的功能。

至於關鍵的執行,把它留給你的類內部處理的執行。就像傑裏所說的,不是存儲49個錯誤和一個錯誤,只需要在矢量旁邊放置一個單獨的成員變量就可以更容易一些,它將簡單地指示哪些條目恰好是關鍵字。