日期格式YYYY-MM-DD HH:MM:SS 的特殊之处在于字典(逐字母)比较与时间比较相同,因此您可以直接使用它。
如果您的容器最初未按日期排序,则您必须一一检查所有日期。 std::copy_if 提供了一种很好的方法:
std::vector<value> get_between(const std::vector<value>& v,
const std::string& from, const std::string& to)
{
std::vector<value> u;
std::copy_if(v.begin(), v.end(), std::inserter(u, u.begin()),
[from,to](const auto& val) {
return val.date >= from && val.date <= to;
});
return u;
}
copy_if 遍历 [v.begin(), v.end()[ 并在 lambda 返回 true 时将元素从 u.begin() 向前插入 u。它们的顺序与您输入时的顺序相同。
如果您的范围已排序,则可以使用 std::lower_bound 和 std::upper_bound 来获取开始和结束迭代器:
std::vector<value> get_between(const std::vector<value>& v,
const std::string& from, const std::string& to)
{
value fromv { "", from, "" };
auto begin = std::lower_bound(v.begin(), v.end(), fromv,
[](const auto& lhs, const auto& rhs) {
return lhs.date < rhs.date;
});
value tov { "", to, "" };
auto end = std::upper_bound(begin, v.end(), tov,
[](const auto& lhs, const auto& rhs) {
return lhs.date < rhs.date;
});
return std::vector<value>(begin, end);
}
lower_bound和upper_bound求至少from的第一个值和大于to的第一个值,这样@的范围987654335@ 是值为[from, to] 的范围。