我制作了一个收集数据然后发送到数据库的表单。
数据库有2个表,一个是主表,第二个表是与它1对多的表。
为了清楚起见,我将其命名:主表是Table1,子表是ElectricEnergy。
在表格中,ElectricEnergy按月和年存储能耗,因此该表格具有以下模式:
ElectricEnergy< #ElectricEnergy_pk,$ Table1_pk,January,February,...,December,Year>
在表单中,用户可以输入特定年份的数据。我将试着说明这一点:
年份: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。
如果需要其他代码,请询问,我会发布。
谢谢。
答案 0 :(得分:2)
使用find_if和lambda过滤器:
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忽略最后一个值(因为它已经超出界限!)。