检查向量中是否已经存在该值
check if the value already exists in vector
我制作了一个表单,用于收集数据,然后将其发送到数据库。
数据库有两个表,一个是主表,第二个是和它有1对多关系的表
为了清楚起见,我将命名它们:主表是Table1,子表是ElectricEnergy。
在表中,ElectricEnergy是通过月份和年份存储的能源消耗,因此该表具有以下模式:
ElectricEnergy<ElectricEnergy_pk,$Table1_pk,一月,二月。。。,年12月>
在表单中,用户可以输入特定年份的数据。我将尝试在下面举例说明:
年份:2012
一月:20.5 kW/h
二月:250.32 kW/h
等等
填充的表格如下所示:
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 |
我的问题是:
检查该值是否在向量中的最佳解决方案是什么?
我知道这个问题很"宽泛",但我至少可以用一个想法来开始。
注意:Year位于矢量的末尾,因此它的迭代器位置为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”, ... );
我在MS Visual Studio中使用C++和纯Win32操作Windows XP。
如果需要额外的代码,问,我会张贴它。
谢谢。
使用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忽略最后一个值(因为它已经超出了界限!)。
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 向量是否存在行主要形式?
- C++ 查找字符串中存在的元素向量
- 迭代时将指向differents类型的指针保存在std::向量中
- 在向量中存储字符串存在 SEG 错误
- C++ 如何检查另一个向量中是否存在矢量的内容
- 如何将向量一的所有元素与向量二进行比较,如果存在最大元素,则将向量二的所有元素与向量三进行比较?
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 如何通过结构中的变量找出结构向量中是否存在结构
- 在C++中传递结构数组 - 被调用函数中不存在结构元素,如何正确传递向量?
- 在向量中查找值,而向量又存在于结构中
- 指向可能不存在的对象的指针向量
- 查找向量的一个向量的元素是否存在于另一个向量中
- 为什么 STL 向量的迭代器可以指向不存在的元素?
- 如何检查c++stl向量中是否存在值,并将函数应用于向量的每个元素
- 如果存在特定元素,则控制向量
- 如何确保向量中访问的索引存在
- 迭代和递归地查找向量中是否存在元素
- 检查向量中是否已经存在该值
- 是否可以将函数指针保存在std::向量中