2017-02-22 29 views
-1

У меня есть «двумерные» данные, хранящиеся в двоичном массиве в основной строке. Мои данные имеют 5 столбцов, время, x, y, z и поле.Как использовать std :: lower_bound с пользовательским итератором?

  1. Т1, x1, y1, z1, F1
  2. Т2, х2, y2, z2, F2
  3. Т3, х3, у3, г3, F3, ...

Эти данные хранится в двойном массиве 1D в основном. Как

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

Теперь я хочу, чтобы найти первую строку данных, для которых время равно или больше заданного значения Т0. Как я могу использовать std :: lower_bound для этого?

Я предполагаю, что мне нужен ForwardIterator, который возвращает каждый пятый элемент в этом массиве, но не делает этого. Любая помощь приветствуется.

+1

Похож на проблему XY. Храните данные в правильном формате (структура с двойными полями), и не только ваша проблема исчезнет, ​​но ваш код станет более читаемым и меньше подвержен ошибкам – Slava

+0

это может помочь: http://stackoverflow.com/questions/5685983/skipping- итератор – NathanOliver

+0

@Slava, я не могу изменить способ хранения данных. – user3469604

ответ

0

Вы можете написать итератор, чтобы делать то, что вы хотите довольно легко. Я не знаю о входе, которое делает именно это.

#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"; 
    } 
} 
+0

Спасибо. Это сделает мою работу! – user3469604