如何将 std::lower_bound 与自定义迭代器一起使用?
How to use std::lower_bound with a custom iterator?
我有一个“二维”数据以连续的方式存储在双精度数组中。
我的数据有 5 列,时间、x、y、z 和字段。
- T1, x1, y1, z1, F1
- T2, x2, y2, z2, F2
- 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,它 returns 该数组中的每个第 5 个元素,但不知道如何做到这一点。任何帮助表示赞赏。
您可以编写一个迭代器来轻松完成您想要的操作。我不知道有这样的插件。
#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";
}
}
我有一个“二维”数据以连续的方式存储在双精度数组中。 我的数据有 5 列,时间、x、y、z 和字段。
- T1, x1, y1, z1, F1
- T2, x2, y2, z2, F2
- 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,它 returns 该数组中的每个第 5 个元素,但不知道如何做到这一点。任何帮助表示赞赏。
您可以编写一个迭代器来轻松完成您想要的操作。我不知道有这样的插件。
#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";
}
}