检查向量中是否已经存在该值

check if the value already exists in vector

本文关键字:存在 向量 是否 检查      更新时间:2023-10-16

我制作了一个表单,用于收集数据,然后将其发送到数据库。

数据库有两个表,一个是主表,第二个是和它有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忽略最后一个值(因为它已经超出了界限!)。