我製作了一個表單,用於收集隨後發送到數據庫的數據。檢查向量中是否已經存在該值
數據庫有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。
如果需要額外的代碼,問,我會發布它。
謝謝。
你是什麼意思'std :: find'不處理最後一個元素?不,你不能修改'std :: set'的成員,但你可以'擦除'和'插入'一個新的。 –
在下面的答案中,向我解釋了爲什麼我關於std :: find的註釋是錯誤的。謝謝你的評論波特先生。 – AlwaysLearningNewStuff
@Jonathan Potther,我有一個問題,波特先生,關於雙打的比較:我在網上讀過一些地方,如果你比較兩個雙打(比如5,5和5,5),可能會因默認精度而出現錯誤。在我的問題中,年份是雙倍的,但它沒有小數,因爲年份是整數。有可能會出現精確度問題,因爲年份會是double類型的嗎?謝謝。問候。 – AlwaysLearningNewStuff