我制作了一个表格来收集数据,然后将其发送到数据库。
数据库有两张表,一张是主表,第二张是一对多的关系。
为了清楚起见,我将它们命名为:主表是 Table1,子表是 ElectricEnergy。
在表 ElectricEnergy 中存储了月份和年份的能源消耗,因此该表具有以下模式:
ElectricEnergy< #ElectricEnergy_pk, $Table1_pk, January,February, ...,December, Year>
在表格中,用户可以输入特定年份的数据。我将尝试在下面说明这一点:
年份:2012
一月:20.5 千瓦/小时
二月: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
看起来很有趣。
(这部分在我编辑问题时被删除:
,但不处理最后一个元素,并且 year 在向量的末尾。
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”, ... );
我在 Windows XP 上工作,在 MS Visual Studio 中,使用 C++ 和纯 Win32。
如果需要其他代码,请询问,我会发布它。
谢谢你。