2013-08-21 105 views
0

我製作了一個表單,用於收集隨後發送到數據庫的數據。檢查向量中是否已經存在該值

數據庫有2個表,其中一個是主表,另一個是主表,另一個表與它是一對多關係。

爲了清楚起見,我將它們命名爲:主表是Table1,子表是ElectricEnergy。

在表ElectricEnergy存儲的能耗,通過幾個月的一年,因此此表下面的模式:

ElectricEnergy < #ElectricEnergy_pk,$ Table1_pk,一月,二月,...,月,年>

在表格中,用戶可以輸入特定年份的數據。我會盡力來說明這個波紋管:

年份:2012

1月:20.5千瓦/小時

2月:250.32千瓦/小時

等。

填充表看起來像這樣:

YEAR | January | February | ... | December | Table1_pk | ElectricEnergy_pk | 
    2012 | 20.5 | 250.32 | ... | 300.45 |  1 |  1    | 
    2013 | 10.5 | 50.32 | ... | 300 |  1 |  2    | 
    2012 | 50.5 | 150.32 | ... | 400.45 |  2 |  3    | 

由於可存放其消費的年數是未知的,我已經決定使用vector來存儲它們。因爲矢量不能包含數組,所以我需要一個13(12個月+年)的數組,我決定將表單數據存儲到一個向量中。

由於數據中有小數點,矢量類型爲double

小澄:

vector<double> DataForSingleYear; 
vector< vector<double> > CollectionOfYears. 

我可以成功地將數據推送到矢量DataForSingleYear,我可以成功地推動這些年爲載體CollectionOfYears。

問題是用戶可以多次輸入同一年編輯框,爲每月消費添加不同的值,這將創建重複的值。

這將是這個樣子:

YEAR | January | February | ... | December | Table1_pk | ElectricEnergy_pk | 
    2012 | 20.5 | 250.32 | ... | 300.45 |  1 |  1    | 
    2012 | 2.5 | 50.32 | ... | 300 |  1 |  2(duplicate!) | 
    2013 | 10.5 | 50.32 | ... | 300 |  1 |  3    | 
    2012 | 50.5 | 150.32 | ... | 400.45 |  2 |  4    | 

我的問題是:

什麼是檢查是否該值是向量的最佳解決方案?

我知道這個問題是「廣泛的」,但我至少可以用一個想法來讓我開始。

注: 年份是在該載體的末端,所以它的迭代器的位置是12。 將被插入到數據庫中的數據的順序並不重要,沒有排序要求任何。

通過通過SO檔案瀏覽,我已經找到了的std::set的使用建議,但它的文檔中說,元素不能插入時修改,那就是我不能接受選項。

另一方面,std::find看起來很有趣。

(這部分被去除時,我編輯的問題:

,但不處理最後一個元素,而今年是在 向量的末尾,可以改變,我願意這樣做。小調整,如果std::find能幫助我。

掠過我的頭腦,通過矢量是循環的唯一的事,看的價值已經存在,但我不認爲這是最佳解決方案:

wchar_t temp[50]; 
    GetDlgItemText(hwnd, IDC_EDIT1, temp, 50); // get the year 
    double year = _wtof(temp); // convert it to double, 
            // so I can push it to the end of the vector 

    bool exists = false; // indicates if the year is already in the vector 

    for(vector< vector <double> >::size_type i = 0; 
     i < CollectionOfYears.size(); i++) 

     if(CollectionOfYears[ i ] [ (vector<double>::size_type) 12 ] == year) 
     { 
     exists = true; 
     break; 
     } 

    if(!exists) 
    // store main vector in the database 
    else 
    MessageBox(... , L」Error」, ...); 

我使用C++和純Win32在MS Visual Studio中使用Windows XP。

如果需要額外的代碼,問,我會發布它。

謝謝。

+4

你是什麼意思'std :: find'不處理最後一個元素?不,你不能修改'std :: set'的成員,但你可以'擦除'和'插入'一個新的。 –

+0

在下面的答案中,向我解釋了爲什麼我關於std :: find的註釋是錯誤的。謝謝你的評論波特先生。 – AlwaysLearningNewStuff

+0

@Jonathan Potther,我有一個問題,波特先生,關於雙打的比較:我在網上讀過一些地方,如果你比較兩個雙打(比如5,5和5,5),可能會因默認精度而出現錯誤。在我的問題中,年份是雙倍的,但它沒有小數,因爲年份是整數。有可能會出現精確度問題,因爲年份會是double類型的嗎?謝謝。問候。 – AlwaysLearningNewStuff

回答

2

使用find_if和λ濾波器:

auto match = std::find_if(CollectionOfYears.begin(), CollectionOfYears.end(), 
          [&year](v){ return year == v.last(); }) 
if (match == CollectionOfYears.end()){ //no value previously 

} 

這仍然遍歷整個陣列。如果你需要更高效的搜索,你應該保持數組排序並使用二分搜索或std :: set。

請注意,vector :: end()將迭代器返回到最後一個元素之後的元素。這就是爲什麼std :: find會忽略最後一個值(因爲它已經超出了界限!)。

+0

你對std :: find的回答幫助我理解了我的錯誤。至於你的解決方案,我從來沒有使用過lambda篩選器和find_if,所以我很難理解你的代碼。在報告結果之前,我需要研究它。謝謝您的回答。 – AlwaysLearningNewStuff

+0

我有一個問題,凱斯基寧先生,關於雙打的比較:我已經在網上閱讀過某個地方,如果你比較兩個雙打(比如5,5和5,5),可能會因默認精度而出現錯誤。在我的問題中,年份是雙倍的,但它沒有小數,因爲年份是整數。有可能會出現精確度問題,因爲年份會是double類型的嗎?謝謝。問候。 – AlwaysLearningNewStuff