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_bound
和std::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_bound
和 std::upper_bound
选择您想要使用的范围。
【讨论】:
以上是关于C++ 仅从数组中获取数据的中间部分的主要内容,如果未能解决你的问题,请参考以下文章