今天,我在问自己,在排序后的 vector std::vector<double>中,大于或等于a而小于或等于b的所有值,可能是最短的代码是什么。

我的第一种方法是如下所示:

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

// Returns all values in sortedValues being greater equal start and smaller equal end;
std::vector<double> cutValues(const std::vector<double>& sortedValues, double start, double end) {
    std::vector<double> ret;

    auto startIter=std::lower_bound(sortedValues.begin(), sortedValues.end(), start);
    auto stopIter = std::upper_bound(sortedValues.begin(), sortedValues.end(), end);
    std::copy(startIter, stopIter, std::back_inserter(ret));
    return ret;
}

int main(int argc, char **args) {
    {
        auto ret = cutValues({ 0.1,0.2,0.3 }, 0.1, 0.3);
        std::copy(ret.begin(), ret.end(), std::ostream_iterator<double>(std::cout, ","));
        std::cout << std::endl;
    }
    {
        auto ret = cutValues({ 0.12,0.2,0.31 }, 0.1, 0.3);
        std::copy(ret.begin(), ret.end(), std::ostream_iterator<double>(std::cout, ","));
        std::cout << std::endl;
    }
    {
        auto ret = cutValues({ 0.1,0.2,0.3 }, 0.2, 0.2);
        std::copy(ret.begin(), ret.end(), std::ostream_iterator<double>(std::cout, ","));
        std::cout << std::endl;
    }
}

我的第二个想法很简单,如下所示:
std::vector<double> cutValues2(const std::vector<double>& sortedValues, double start, double end) {
    std::vector<double> ret;
    std::copy_if(sortedValues.begin(), sortedValues.end(), std::back_inserter(ret), [&start, &end](auto v) { return v >= start && v <= end; });
    return ret;
}

但是考虑仅从很大的 vector 中删除一小部分的情况,这可能会带来一些效率问题。

现在我问自己,是否还有更好的方法?

最佳答案

第一个版本有些更改:

std::vector<double> cutValues(const std::vector<double>& sortedValues, double start, double end) {
    auto startIter = std::lower_bound(sortedValues.begin(), sortedValues.end(), start);
    auto stopIter = std::upper_bound(startIter, sortedValues.end(), end);
    return std::vector<double>(startIter, stopIter);
}

关于c++ - 获取位于一定时间间隔的值的排序列表的子列表的最短方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45751009/

10-11 16:13