将部分可编辑对象的集合传递给算法
Passing a collection of partially editable objects to an algorithm
我用一个简单的例子简化了我的问题:immagine 我管理一个元素集合std::vector<Element>
,每个元素有几个成员:
struct Element
{
public:
double foo;
double bar;
};
然后,我想定义一个抽象类BarEvaluator
,用于算法从a
的值计算b
的值。我的第一个想法如下:
class BarEvaluator
{
public:
virtual void evaluate(std::vector<Element>& elements) const = 0;
};
由此,我可以实现几种算法,例如,将bar
值计算为foo
值的平方的算法:
class SqrBarEvaluator
{
public:
virtual void evaluate(std::vector<Element>& elements) const
{
for(unsigned long int i = 0; i < elements.size(); ++i)
elements[i].bar = elements[i].foo * elements[i].foo;
}
};
这运作良好。但我认为这不是一个非常好的架构,因为我的算法也能够修改foo
值。我不想这样。
然后我希望能够将我的集合提供给带有一种"过滤器"的算法,允许仅修改bar
变量,而不是每个元素中的foo
变量。C++98 可以吗?我不知道该怎么做。
注1:我不想在Element
中用public
或private
这样做。你可以想象我还想创建算法FooEvaluator
从bar
值计算foo
值,并具有对foo
而不是bar
的写入访问权限。
注2:算法可以要求所有集合来计算每个值。
也许你应该把循环拉出接口。
class BarEvaluator
{
public:
virtual double evaluate(const Element& element) const = 0;
};
class SqrBarEvaluator
{
public:
virtual double evaluate(const Element& element) const
{
return element.foo * element.foo;
}
};
然后你这样称呼它:
std::vector<Element> elements;
...
for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it) {
it->bar = barEvaluator.evaluate(*it);
}
您可以使用包装器:
class BarElementWrapper
{
public:
BarElementWrapper(Element& e) : elem(e) { }
double getFoo() { return elem.foo; }
void setBar(double b) { elem.bar = b; }
private:
Element& elem;
}
然后你的算法会收到一个 BarElementWrapper 的集合。
相关文章:
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 算法 - 集合中出现了多少次
- 为什么这个位集集合算法不起作用
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 使用STL算法查找集合中的所有匹配项
- 将集合与集合进行比较的最佳算法
- 使用 STL 算法查找集合中的前两个不相邻元素
- 使用专用函数对异构集合的 STL 算法
- 从一组集合中找出所有不相交集合的算法是什么
- 在块集合中统一连续块的算法
- [唯一相等运算符]在集合中查找重复元素并将其分组的快速算法是什么
- 对于每个连接点集合,通过所有连接点一次的算法
- 计算包含某些项的列表集合的唯一排列的算法
- 输出或遍历集合的所有对组合的标准算法
- 将部分可编辑对象的集合传递给算法
- 贪心算法错误使用c++集合
- 对集合中的每个元素调用print的通用算法
- 生成一个集合的所有可能序列的并行算法