【问题标题】:How to use std::lower_bound with a custom iterator?如何将 std::lower_bound 与自定义迭代器一起使用?
【发布时间】:2017-02-22 16:42:25
【问题描述】:

我有一个“二维”数据以行主要方式存储在双精度数组中。 我的数据有 5 列,时间、x、y、z 和字段。

  1. T1, x1, y1, z1, F1
  2. T2, x2, y2, z2, F2
  3. T3、x3、y3、z3、F3 …

此数据以行主要方式存储在双一维数组中。喜欢

double dataArray[] = { T1, x1, y1,z1,F1, T2,x2,y2,z2,F2, T3,x3,y3,z3,F3, ... };

现在我想找到时间等于或大于给定值 T0 的数据的第一行。我怎样才能使用 std::lower_bound 来做到这一点?

我想我需要一个 ForwardIterator 来返回该数组中的每 5 个元素,但不知道如何做到这一点。任何帮助表示赞赏。

【问题讨论】:

  • 看起来像 XY 问题。以正确的格式存储数据(具有双字段的结构),不仅您的问题会消失,而且您的代码会变得更具可读性并且不易出错
  • @Slava,我无法更改数据的存储方式。
  • 遇到行主要格式的数据是很常见的(例如与 fortran 交互时)。仅仅为了迭代而改变表示是非常低效的。 C++ 的伟大之处在于您可以定义在任何数据格式上以预期方式工作的类型。
  • @ArtYerkes,正是我的情况,我的 dataArray 来自 FORTRAN 子例程,我无法更改下划线数据结构。在 FORTRAN 和 C++ 例程中访问相同的数据。

标签: c++ stl stl-algorithm


【解决方案1】:

您可以编写一个迭代器来轻松完成您想做的事情。我不知道有一个插件可以做到这一点。

#include <algorithm>
#include <iostream>

template <typename T> struct SkipIt : public std::iterator<std::forward_iterator_tag, T> {
    SkipIt(T *t, unsigned skip) : elt(t), skip(skip) {}
    bool operator == (const SkipIt<T> &other) const { return elt == other.elt; }
    bool operator != (const SkipIt<T> &other) const { return elt != other.elt; }
     T *operator -> () const { return elt; }
    T &operator * () const { return *elt; }
    SkipIt &operator ++ () { elt += skip; return *this; }
    SkipIt operator ++ (int) { auto ret = *this; ++*this; return ret; }
    SkipIt operator + (int amt) const { auto ret = SkipIt(elt + amt * skip, skip); return ret; }

private:
    unsigned skip;
    T *elt;
};

int main() {
    double test[] =
        { 0.1, 0.2, 0.3
        , 1.1, 1.2, 1.3
        , 2.1, 2.2, 2.3
        , 3.1, 3.2, 3.3
        };
    auto begin = SkipIt<double>(test, 3);
    auto end = begin + 4;
    auto res = std::lower_bound(begin, end, 2.0);
    if (res == end) {
        std::cout << "Lower bound not found\n";
    } else {
        std::cout << "Lower bound of 2.0: " << *res << "\n";
    }
}

【讨论】:

  • 谢谢。这将完成我的工作!
猜你喜欢
  • 1970-01-01
  • 2022-10-07
  • 2015-02-04
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多