是否存在仅包含第一个和最后一个值的c ++容器?

时间:2016-11-18 05:56:29

标签: c++ algorithm performance stl containers

我需要一个只用范围的第一个和最后一个值初始化的容器。

我需要一个如下所示的容器:

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

bound将在容器内迭代期间定义对象之间的距离。例如,如果first=0last=10bound=1迭代将对包含firstlast的每个整数执行。如果bound=2,迭代将在{0,2,4,6,8,10}内执行。但大小将是2; myRange[0]=firstmyRange[1]=last

简而言之,一个容器允许迭代不存在的对象。迭代超过第一个,第一个+绑定,第一个+ 2 *绑定,第一个+ n *绑定,直到到达最后一个元素。我不想使用数组。

count()方法将返回给定条件范围return true范围内的对象数。

N.B.我是初学者,所以 如果 有解决方案,请详细说明:) 感谢您抽出宝贵时间;)

1 个答案:

答案 0 :(得分:-2)

参见以下实施:

  
    

cat 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
  
    

cat 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函数实现中的define对代码进行了硬编码。如果你想让count函数足够通用以评估任何泛型表达式,那么我想我需要在代码中使用regular-expression。 在我开始实施之前,我想确认这是否真的是你正在寻找的。