C++ 仅从数组中获取数据的中间部分

Posted

技术标签:

【中文标题】C++ 仅从数组中获取数据的中间部分【英文标题】:C++ getting only the middle part of data from an array 【发布时间】:2017-02-25 18:55:28 【问题描述】:

我有一个这样的数组:

string dates [5] =  "15-JAN-17", "15-JAN-17", "17-JAN-17", 
                  "04-FEB-17", "04-FEB-17" ; 

string startDate = "15-JAN-17";
string endDate   = "04-FEB-17";

有没有办法在开始日期和结束日期之间获取数据?我需要得到的是:

"15-JAN-17", "17-JAN-17", "04-FEB-17"

我计划使用 for 循环进行搜索,并将所有结果放入另一个名为 selectedDates 的数组中。我怎样才能得到这个结果,而且由于会有重复的日期,我怎样才能确保程序从第一个结果开始,并在 startDate 和 endDate 提供的最后一个结果结束?

编辑:我还应该提到,即使数组变大,日期也将始终进行排序。

【问题讨论】:

您的意思是获取数组的两个指针之间的数据,或者获取数组的两个对象之间的数据,这等于提到的字符串? 你的代码还能编译吗? dates的类型真的是int [5]吗? 我的意思是获取上述字符串之间的数据。但是,由于日期可能有重复,我需要获取第一个“15-JAN-17”和最后一个“04-FEB-17”之间的数据。哦,是的,我搞砸了,应该将数组更改为字符串 xD 如果数组是sorted,那么std::lower_boundstd::upper_bound(以及对std::unique 的调用)可能会对您有所帮助。 【参考方案1】:

鉴于您计划对这些字符串执行的各种操作,我认为定义一些新的自定义类型来表示日期是最有意义的。构造函数会将日期字符串解析为明确的年、月和日,并且您可以提供对每个字段的读取访问权限。完成此操作后,您可以重载日期类型上的关系运算符,以便您可以比较日期并将其排序为升序。

一旦你有了类似的东西,你就有很多关于如何继续的选择。一种方法是将所有内容放入std::set,它会自动消除重复并保持排序顺序,这样您就可以像这样执行范围查询:

std::set<Date> dates = /* ... */
for (auto itr = dates.lower_bound(Date"15-JAN-17"),
     end = dates.upper_bound(Date"04-FEB-17");
    itr != end; ++itr) 
    // Use *itr

您还可以将所有内容存储在 std::vector 中,使用 std::unique 删除重复项,然后使用 std::lower_boundstd::upper_bound 选择您想要使用的范围。

【讨论】:

以上是关于C++ 仅从数组中获取数据的中间部分的主要内容,如果未能解决你的问题,请参考以下文章

如何仅从 JSON 数据中获取最后 10 个对象

c++ 获取文件的一部分

读取包含二维矩阵的 .txt 文件,fscanf 仅从 .txt 文件中获取第一个数据元素

使用 NSPredicate 仅从字典数组中获取特定键的值

我无法从数据库中获取所有图像仅从数据库中获取单个图像

仅从具有 id 作为 JQuery 数组的表单中获取数值?