c++ - 检查该值是否已存在于 vector 中

标签 c++ winapi

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

数据库有两个表,一个是主表,第二个是一对多的关系。

为了清楚起见,我将它们命名为:主表是 Table1,子表是 ElectricEnergy。

表中的 ElectricEnergy 是按月和年存储的能量消耗,因此该表具有以下架构:

ElectricEnergy< #ElectricEnergy_pk,$Table1_pk,一月,二月,...,十二月,年>

在表单中,用户可以输入特定年份的数据。我将尝试在下面说明这一点:

年份:2012

一月:20.5 kW/h

2 月: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来存储它们。

由于 vector 不能包含数组,而我需要一个 13(12 个月 + 年)的数组,我决定将表单数据存储到一个 vector 中。

由于数据中有小数, vector 类型为double

一个小的澄清:

vector<double> DataForSingleYear;
vector< vector<double> > CollectionOfYears.

我可以成功地将数据推送到 vector DataForSingleYear 中,并且我可以成功地将所有这些年份推送到 vector 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             |

我的问题是:

检查该值是否在 vector 中的最佳解决方案是什么?

我知道这个问题很“广泛”,但我至少可以使用一个想法来让我开始。

注意: 年份在 vector 的末尾,所以它的迭代器位置是 12。 将被插入数据库的数据的顺序并不重要,没有任何排序要求。

通过浏览 SO 文件,我找到了关于使用 std::set 的建议,但是它的文档说插入时元素不能被修改,这对我来说是 Not Acceptable 选项。

另一方面,std::find 看起来很有趣。

(这部分在我编辑问题时被删除了:

, but does not handle last element, and year is at the end of the vector. That can change, and I am willing to do that small adjustment if std::find can help me.

)

我唯一想到的是遍历 vector ,看看值是否已经存在,但我认为这不是最好的解决方案:

    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。

如果需要额外的代码,请询问,我会发布。

谢谢。

最佳答案

使用 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 忽略最后一个值的原因(因为它已经越界了!)。

关于c++ - 检查该值是否已存在于 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18367950/

相关文章:

c++ - 在 C/C++ 中声明变量

c++ - 运算符优先级和评估顺序

delphi - 将窗口嵌入到另一个进程中

c++ - 在鼠标光标平面上绘制还是创建自定义动画系统光标?

c++ - 内存泄漏 C++

c++ - 如何将 Qt 与应用程序打包(但不是静态的)

perl - Vanilla Perl 和 Strawberry Perl 有什么区别?

c++ - 更新控件时,Win32窗口未重绘

c++ - 后进先出法的真正含义是什么?

c++ - 使用 win32 线程进行矩阵乘法