2016-11-18 4 views
0

Мне нужен контейнер, который будет инициализирован только первым и последним значением диапазона.Существует ли контейнер C++ только с первым и последним значением?

мне нужен контейнер, глядя, как показано ниже:

range<int> myRange(first, last, bound); 
int occur=myRange.count(r%5==0 && r%10!=0); 

bound будет определять расстояние между объектами во время итерации внутри контейнера. Например, если first=0, last=10 и bound=1 итерация будет выполняться на каждое целое число от first до last включительно. Если bound=2, то итерация будет выполняться в пределах {0,2,4,6,8,10}. Но размер будет 2; myRange[0]=first и myRange[1]=last.

Короткий контейнер, допускающий итерацию по несуществующим объектам. Итерация сначала, первая + связанная, первая + 2 * связанная, первая + n * связанная до достижения последнего элемента. Я не хочу использовать массив.

Метод count() возвращает количество объектов в диапазоне return true для данного состояния.

NBI'm новичок, так если есть решение, пожалуйста, подробно, как минимум :) Спасибо, что нашли время;)

+5

По определению это не * контейнер *. Это * диапазон *. –

+0

Я уже искал диапазон и ничего не нашел. –

+2

Поиск сложнее, например: http://www.boost.org/doc/libs/1_62_0/libs/range/doc/html/range/reference/ranges/irange.html –

ответ

-2

Смотрите следующие реализации:

кошка range.h

#ifndef _RANGE_H_ 
#define _RANGE_H_ 

#include <climits> 
#include <cassert> 
#define expr(var) (var%5 == 0 && var%10 != 0) 

class Range { 
    int first; 
    int last; 
    int bound; 
    friend class RangeIterator; 

    public: 
    Range(int f, int l, int b) : first(f), last(l), bound(b) {} 
    ~Range() {} 

    int count() const { 
     int cnt = 0; 
     for (int i = first; i <= last; i += bound) { 
      if (expr(i)) 
       cnt++; 
     } 
     return cnt; 
    } 

    int getFirst() const { return first; } 
    int getLast() const { return last; } 
}; 

class RangeIterator { 
    const Range* mRange; 
    int mCurrVal; 

    public: 
    RangeIterator(const Range* range) : mRange(range) 
    { 
     assert(range); 
     mCurrVal = mRange->first; 
    } 

    ~RangeIterator() {} 

    int getNext() { 
     int ret = INT_MIN; 
     if (mCurrVal <= mRange->last) { 
      ret = mCurrVal; 
      mCurrVal += mRange->bound; 
     } 
     return ret; 
    } 
}; 

#endif 

кошка main.cxx

#include <iostream> 
#include <climits> 
#include "range.h" 
using namespace std; 

int main() { 
    Range r(0, 50, 5); 

    RangeIterator ri(&r); 
    int curr = INT_MIN; 
    while ((curr = ri.getNext()) != INT_MIN) { 
     cout << curr << '\t'; 
    } 
    cout << endl; 

    cout << "count is : " << r.count() << endl; 
    return 0; 
} 

Я жестко закодировано состояние с помощью определения в реализации графа функции. Если вы хотите, чтобы функция count была достаточно общей, чтобы оценить какое-либо общее выражение, тогда, я думаю, мне нужно будет использовать регулярное выражение в коде. Прежде чем приступить к реализации, я хотел бы подтвердить, действительно ли это то, что вы ищете.

+0

Любое оправдание игнорирования соглашений C++ и STL на * итераторе * и * алгоритме *? –

+0

Что вы подразумеваете под конвенцией C++? Мне не было известно о существующем итераторе STL, поэтому я внедрил его. – Dharmendra

+0

В принципе, * тип требование *, или * концепция *. Например, оператор инкремента, оператор разыменования, типы членов и т. Д. В соответствии с первоначальным STL, который в настоящее время определен Международным стандартом, хорошо известным среди разработчиков на C++ и соответствующим многим сторонним библиотекам. –