使用lower_bound()和upper_bound()选择记录

oom*_*pah 0 c++

我有一个对象的地图,由日期键入(存储为双).我想根据日期过滤/提取对象,所以我编写了一个类似下面的代码片段的函数.

但是,我发现如果我提供的日期低于最早日期或大于最后日期,则代码将失败.我修改了代码,以便任何低于第一个日期的输入startdate设置为地图中的第一个(即最低)日期,同样,enddate> last date设置为地图中的最后一个(最大)日期

void extractDataRecords(const DatedRecordset& recs, OutStruct& out, const double startdt, const double enddt)
{
    double first = recs.begin()->first, last = recs.rbegin()->first;
    const double sdate = (start < first) ? first : startdt;
    const double edate = (enddt > last) ? last : enddt;

    DatedRecordsetConstIter start_iter = recs.lower_bound(sdate), end_iter = recs.upper_bound(edate);

    if ((start_iter != recs.end()) && (end_iter != recs.end()))
    {

        // do Something
    }
}
Run Code Online (Sandbox Code Playgroud)

这是实现这种行为的正确方法吗?

Jer*_*fin 9

std::lower_bound返回:" value可以在不违反排序的情况下插入的第一个位置." std::upper_bound返回:" value可以在不违反排序的情况下插入的最远位置." 换句话说,如果您在任一位置插入新项目,则可以保证集合的整体排序保持不变.

无论如何你都要使用它们,你应该使用std::equal_range它 - 它返回一个std::pair迭代器,一个与返回的迭代器相同,另一个lower_bound返回相同的迭代器upper_bound.虽然它具有与分别调用两者相同的最坏情况复杂性,但它通常比两个单独的调用更快.

值得一提的,但是,如果你有什么是真的map(而不是一个multimap)只能有一个条目与给定的关键,所以没有太多的理由来应对这两个lower_boundupper_bound任何给定的关键.