我需要一个只用范围的第一个和最后一个值初始化的容器。
我需要一个如下所示的容器:
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
范围内的对象数。
N.B.我是初学者,所以 如果 有解决方案,请详细说明:) 感谢您抽出宝贵时间;)
答案 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。 在我开始实施之前,我想确认这是否真的是你正在寻找的。 p>